19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Build resource files from raw assets.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef RESOURCE_TABLE_H
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define RESOURCE_TABLE_H
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "StringPool.h"
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SourcePos.h"
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <set>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <map>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace std;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackbornclass XMLNode;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ResourceTable;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_STRIP_COMMENTS = 1<<0,
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_STRIP_WHITESPACE = 1<<3,
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
2719138468caf7050d482dc15f35a344eab11bb756Kenny Root    XML_COMPILE_UTF8 = 1<<5,
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XML_COMPILE_STANDARD_RESOURCE =
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t compileXmlFile(const sp<AaptAssets>& assets,
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        const sp<AaptFile>& target,
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ResourceTable* table,
37cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        int options = XML_COMPILE_STANDARD_RESOURCE);
38cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn
39cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackbornstatus_t compileXmlFile(const sp<AaptAssets>& assets,
40cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        const sp<AaptFile>& target,
41cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        const sp<AaptFile>& outTarget,
42cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        ResourceTable* table,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int options = XML_COMPILE_STANDARD_RESOURCE);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackbornstatus_t compileXmlFile(const sp<AaptAssets>& assets,
46a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        const sp<XMLNode>& xmlTree,
47a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        const sp<AaptFile>& target,
48a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        ResourceTable* table,
49a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        int options = XML_COMPILE_STANDARD_RESOURCE);
50a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t compileResourceFile(Bundle* bundle,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const sp<AaptAssets>& assets,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const sp<AaptFile>& in,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const ResTable_config& defParams,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const bool overwrite,
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             ResourceTable* outTable);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct AccessorCookie
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SourcePos sourcePos;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 attr;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 value;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        :sourcePos(p),
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         attr(a),
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         value(v)
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ResourceTable : public ResTable::Accessor
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Package;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Type;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Entry;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResourceTable(Bundle* bundle, const String16& assetsPackage);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addPublic(const SourcePos& pos,
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& package,
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const uint32_t ident);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addEntry(const SourcePos& pos,
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& package,
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& type,
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& name,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& value,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const Vector<StringPool::entry_style_span>* style = NULL,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const ResTable_config* params = NULL,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const bool doSetIndex = false,
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const int32_t format = ResTable_map::TYPE_ANY,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const bool overwrite = false);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t startBag(const SourcePos& pos,
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& package,
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& type,
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& name,
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagParent,
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const ResTable_config* params = NULL,
1061aa8170e6a448afad86e5d62927d3b8ca4cd9707Robert Greenwalt                    bool overlay = false,
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool replace = false,
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool isId = false);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addBag(const SourcePos& pos,
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& package,
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& type,
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& name,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagParent,
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagKey,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& value,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const Vector<StringPool::entry_style_span>* style = NULL,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const ResTable_config* params = NULL,
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool replace = false,
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool isId = false,
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const int32_t format = ResTable_map::TYPE_ANY);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasBagOrEntry(const String16& package,
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name) const;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasBagOrEntry(const String16& ref,
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16* defType = NULL,
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16* defPackage = NULL);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool appendComment(const String16& package,
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& comment,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool onlyIfEmpty = false);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool appendTypeComment(const String16& package,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& type,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& name,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& comment);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14258c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn    void canAddEntry(const SourcePos& pos,
14358c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        const String16& package, const String16& type, const String16& name);
14458c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t size() const;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t numLocalResources() const;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasResources() const;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptFile> flatten(Bundle*);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline uint32_t makeResId(uint32_t packageId,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     uint32_t typeId,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     uint32_t nameId)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return nameId | (typeId<<16) | (packageId<<24);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline uint32_t getResId(const sp<Package>& p,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<Type>& t,
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t nameId);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getResId(const String16& package,
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& type,
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& name,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      bool onlyPublic = false) const;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getResId(const String16& ref,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16* defType = NULL,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16* defPackage = NULL,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const char** outErrorMsg = NULL,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      bool onlyPublic = false) const;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool isValidResourceName(const String16& s);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool stringToValue(Res_value* outValue, StringPool* pool,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& str,
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool preserveSpaces, bool coerceType,
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       uint32_t attrID,
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const Vector<StringPool::entry_style_span>* style = NULL,
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       String16* outStr = NULL, void* accessorCookie = NULL,
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       uint32_t attrType = ResTable_map::TYPE_ANY);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t assignResourceIds();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addLocalization(const String16& name, const String8& locale);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t validateLocalizations(void);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t flatten(Bundle*, const sp<AaptFile>& dest);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writePublicDefinitions(const String16& package, FILE* fp);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getCustomResource(const String16& package,
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       const String16& type,
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       const String16& name) const;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getCustomResourceWithCreation(const String16& package,
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const String16& type,
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const String16& name,
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const bool createIfNeeded);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeEnum(uint32_t attrID,
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  const char16_t* name, size_t nameLen,
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  Res_value* outValue);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeFlags(uint32_t attrID,
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   const char16_t* name, size_t nameLen,
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   Res_value* outValue);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getAttributeL10N(uint32_t attrID);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getLocalizationSetting();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void reportError(void* accessorCookie, const char* fmt, ...);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Item {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            { memset(&parsedValue, 0, sizeof(parsedValue)); }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item(const SourcePos& pos,
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             bool _isId,
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             const String16& _value,
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             const Vector<StringPool::entry_style_span>* _style = NULL,
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             int32_t format = ResTable_map::TYPE_ANY);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item(const Item& o) : sourcePos(o.sourcePos),
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            isId(o.isId), value(o.value), style(o.style),
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            memset(&parsedValue, 0, sizeof(parsedValue));
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ~Item() { }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item& operator=(const Item& o) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sourcePos = o.sourcePos;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            isId = o.isId;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = o.value;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            style = o.style;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            format = o.format;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bagKeyId = o.bagKeyId;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parsedValue = o.parsedValue;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos                               sourcePos;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable bool                            isId;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16                                value;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<StringPool::entry_style_span>    style;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t                                 format;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t                                bagKeyId;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable bool                            evaluating;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Res_value                               parsedValue;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Entry : public RefBase {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Entry(const String16& name, const SourcePos& pos)
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : mName(name), mType(TYPE_UNKNOWN),
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Entry() { }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enum type {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_UNKNOWN = 0,
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_ITEM,
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_BAG
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type getType() const { return mType; }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setParent(const String16& parent) { mParent = parent; }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getParent() const { return mParent; }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t makeItABag(const SourcePos& sourcePos);
2754b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt
2764b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt        status_t emptyBag(const SourcePos& sourcePos);
2774b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setItem(const SourcePos& pos,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const String16& value,
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const Vector<StringPool::entry_style_span>* style = NULL,
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         int32_t format = ResTable_map::TYPE_ANY,
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const bool overwrite = false);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t addToBag(const SourcePos& pos,
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          const String16& key, const String16& value,
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          const Vector<StringPool::entry_style_span>* style = NULL,
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          bool replace=false, bool isId = false,
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          int32_t format = ResTable_map::TYPE_ANY);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Index of the entry's name string in the key pool.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getNameIndex() const { return mNameIndex; }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setNameIndex(int32_t index) { mNameIndex = index; }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const KeyedVector<String16, Item>& getBag() const { return mBag; }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t generateAttributes(ResourceTable* table,
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const String16& package);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t assignResourceIds(ResourceTable* table,
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   const String16& package);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t prepareFlatten(StringPool* strings, ResourceTable* table);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mName;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mParent;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type mType;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item mItem;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mItemFormat;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyedVector<String16, Item> mBag;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mNameIndex;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t mParentId;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPos;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct ConfigDescription : public ResTable_config {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigDescription() {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            memset(this, 0, sizeof(*this));
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size = sizeof(ResTable_config);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigDescription(const ResTable_config&o) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *static_cast<ResTable_config*>(this) = o;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size = sizeof(ResTable_config);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigDescription(const ConfigDescription&o) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *static_cast<ResTable_config*>(this) = o;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigDescription& operator=(const ResTable_config& o) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *static_cast<ResTable_config*>(this) = o;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size = sizeof(ResTable_config);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigDescription& operator=(const ConfigDescription& o) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *static_cast<ResTable_config*>(this) = o;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator<(const ConfigDescription& o) const { return compare(o) < 0; }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator<=(const ConfigDescription& o) const { return compare(o) <= 0; }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator==(const ConfigDescription& o) const { return compare(o) == 0; }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator!=(const ConfigDescription& o) const { return compare(o) != 0; }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator>=(const ConfigDescription& o) const { return compare(o) >= 0; }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline bool operator>(const ConfigDescription& o) const { return compare(o) > 0; }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class ConfigList : public RefBase {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigList(const String16& name, const SourcePos& pos)
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~ConfigList() { }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void appendComment(const String16& comment, bool onlyIfEmpty = false);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16& getComment() const { return mComment; }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void appendTypeComment(const String16& comment);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16& getTypeComment() const { return mTypeComment; }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Index of this entry in its Type.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getEntryIndex() const { return mEntryIndex; }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setEntryIndex(int32_t index) { mEntryIndex = index; }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setPublic(bool pub) { mPublic = pub; }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool getPublic() const { return mPublic; }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries.add(config, entry);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16 mName;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos mPos;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mComment;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mTypeComment;
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mPublic;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPublicSourcePos;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mEntryIndex;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Public {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public() : sourcePos(), ident(0) { }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public(const SourcePos& pos,
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               const String16& _comment,
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               uint32_t _ident)
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : sourcePos(pos),
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment(_comment), ident(_ident) { }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public(const Public& o) : sourcePos(o.sourcePos),
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment(o.comment), ident(o.ident) { }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ~Public() { }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public& operator=(const Public& o) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sourcePos = o.sourcePos;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment = o.comment;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ident = o.ident;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos   sourcePos;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16    comment;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t    ident;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Type : public RefBase {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Type(const String16& name, const SourcePos& pos)
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Type() { delete mFirstPublicSourcePos; }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t addPublic(const SourcePos& pos,
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& name,
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const uint32_t ident);
42658c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
42758c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        void canAddEntry(const String16& name);
42858c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<Entry> getEntry(const String16& entry,
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const SourcePos& pos,
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const ResTable_config* config = NULL,
433f878e2d80c3a0afefe3b018d232df6066379e1d5Robert Greenwalt                           bool doSetIndex = false,
43499080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                           bool overlay = false,
43599080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                           bool autoAddOverlay = false);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getPublicIndex() const { return mPublicIndex; }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getIndex() const { return mIndex; }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setIndex(int32_t index) { mIndex = index; }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t applyPublicEntryOrder();
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SortedVector<ConfigDescription>& getUniqueConfigs() const { return mUniqueConfigs; }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45158c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
45258c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mName;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos* mFirstPublicSourcePos;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, Public> mPublic;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector<ConfigDescription> mUniqueConfigs;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<sp<ConfigList> > mOrderedConfigs;
46158c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        SortedVector<String16> mCanAddEntries;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mPublicIndex;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mIndex;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPos;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Package : public RefBase {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package(const String16& name, ssize_t includedId=-1);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Package() { }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<Type> getType(const String16& type,
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const SourcePos& pos,
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         bool doSetIndex = false);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t getAssignedId() const { return mIncludedId; }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setTypeStrings(const sp<AaptFile>& data);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setKeyStrings(const sp<AaptFile>& data);
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t applyPublicTypeOrder();
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setStrings(const sp<AaptFile>& data,
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ResStringPool* strings,
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            DefaultKeyedVector<String16, uint32_t>* mappings);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16 mName;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ssize_t mIncludedId;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, sp<Type> > mTypes;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<sp<Type> > mOrderedTypes;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> mTypeStringsData;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> mKeyStringsData;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ResStringPool mTypeStrings;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ResStringPool mKeyStrings;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Package> getPackage(const String16& package);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Type> getType(const String16& package,
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     const String16& type,
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     const SourcePos& pos,
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     bool doSetIndex = false);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Entry> getEntry(const String16& package,
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const SourcePos& pos,
522f878e2d80c3a0afefe3b018d232df6066379e1d5Robert Greenwalt                       bool overlay,
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const ResTable_config* config = NULL,
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool doSetIndex = false);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<const Entry> getEntry(uint32_t resID,
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const ResTable_config* config = NULL) const;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const Item* getItem(uint32_t resID, uint32_t attrID) const;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool getItemValue(uint32_t resID, uint32_t attrID,
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      Res_value* outValue);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 mAssetsPackage;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptAssets> mAssets;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DefaultKeyedVector<String16, sp<Package> > mPackages;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<sp<Package> > mOrderedPackages;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mNextPackageId;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mHaveAppPackage;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mIsAppPackage;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t mNumLocal;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SourcePos mCurrentXmlPos;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle* mBundle;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // key = string resource name, value = set of locales in which that name is defined
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    map<String16, set<String8> > mLocalizations;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ResourceFilter
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResourceFilter() : mData(), mContainsPseudo(false) {}
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t parse(const char* arg);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool match(int axis, uint32_t value);
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool match(const ResTable_config& config);
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline bool containsPseudo() { return mContainsPseudo; }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    KeyedVector<int,SortedVector<uint32_t> > mData;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mContainsPseudo;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
563