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
796c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn    struct ConfigDescription : public ResTable_config {
806c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        ConfigDescription() {
816c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            memset(this, 0, sizeof(*this));
826c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            size = sizeof(ResTable_config);
836c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        }
846c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        ConfigDescription(const ResTable_config&o) {
856c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            *static_cast<ResTable_config*>(this) = o;
866c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            size = sizeof(ResTable_config);
876c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        }
886c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        ConfigDescription(const ConfigDescription&o) {
896c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            *static_cast<ResTable_config*>(this) = o;
906c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        }
916c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn
926c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        ConfigDescription& operator=(const ResTable_config& o) {
936c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            *static_cast<ResTable_config*>(this) = o;
946c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            size = sizeof(ResTable_config);
956c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            return *this;
966c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        }
976c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        ConfigDescription& operator=(const ConfigDescription& o) {
986c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            *static_cast<ResTable_config*>(this) = o;
996c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn            return *this;
1006c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        }
1016c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn
1026c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator<(const ConfigDescription& o) const { return compare(o) < 0; }
1036c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator<=(const ConfigDescription& o) const { return compare(o) <= 0; }
1046c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator==(const ConfigDescription& o) const { return compare(o) == 0; }
1056c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator!=(const ConfigDescription& o) const { return compare(o) != 0; }
1066c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator>=(const ConfigDescription& o) const { return compare(o) >= 0; }
1076c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        inline bool operator>(const ConfigDescription& o) const { return compare(o) > 0; }
1086c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn    };
1096c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResourceTable(Bundle* bundle, const String16& assetsPackage);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addPublic(const SourcePos& pos,
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& package,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const uint32_t ident);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addEntry(const SourcePos& pos,
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& package,
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& type,
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& name,
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& value,
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const Vector<StringPool::entry_style_span>* style = NULL,
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const ResTable_config* params = NULL,
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const bool doSetIndex = false,
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const int32_t format = ResTable_map::TYPE_ANY,
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const bool overwrite = false);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t startBag(const SourcePos& pos,
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& package,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& type,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& name,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagParent,
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const ResTable_config* params = NULL,
1371aa8170e6a448afad86e5d62927d3b8ca4cd9707Robert Greenwalt                    bool overlay = false,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool replace = false,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool isId = false);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addBag(const SourcePos& pos,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& package,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& type,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& name,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagParent,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& bagKey,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const String16& value,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const Vector<StringPool::entry_style_span>* style = NULL,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const ResTable_config* params = NULL,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool replace = false,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool isId = false,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const int32_t format = ResTable_map::TYPE_ANY);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasBagOrEntry(const String16& package,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name) const;
157914f7e683a01f15f8830810c49eaecc31bc554a6Eric Fischer
158914f7e683a01f15f8830810c49eaecc31bc554a6Eric Fischer    bool hasBagOrEntry(const String16& package,
159914f7e683a01f15f8830810c49eaecc31bc554a6Eric Fischer                       const String16& type,
160914f7e683a01f15f8830810c49eaecc31bc554a6Eric Fischer                       const String16& name,
161914f7e683a01f15f8830810c49eaecc31bc554a6Eric Fischer                       const ResTable_config& config) const;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasBagOrEntry(const String16& ref,
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16* defType = NULL,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16* defPackage = NULL);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool appendComment(const String16& package,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& comment,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool onlyIfEmpty = false);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool appendTypeComment(const String16& package,
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& type,
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& name,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& comment);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17858c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn    void canAddEntry(const SourcePos& pos,
17958c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        const String16& package, const String16& type, const String16& name);
18058c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t size() const;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t numLocalResources() const;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool hasResources() const;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptFile> flatten(Bundle*);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline uint32_t makeResId(uint32_t packageId,
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     uint32_t typeId,
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     uint32_t nameId)
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return nameId | (typeId<<16) | (packageId<<24);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline uint32_t getResId(const sp<Package>& p,
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<Type>& t,
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t nameId);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getResId(const String16& package,
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& type,
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16& name,
201426431adcc220b6adfbe1d9530247f897e60fa36Dianne Hackborn                      bool onlyPublic = true) const;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getResId(const String16& ref,
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16* defType = NULL,
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const String16* defPackage = NULL,
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const char** outErrorMsg = NULL,
207426431adcc220b6adfbe1d9530247f897e60fa36Dianne Hackborn                      bool onlyPublic = true) const;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool isValidResourceName(const String16& s);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool stringToValue(Res_value* outValue, StringPool* pool,
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& str,
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool preserveSpaces, bool coerceType,
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       uint32_t attrID,
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const Vector<StringPool::entry_style_span>* style = NULL,
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       String16* outStr = NULL, void* accessorCookie = NULL,
2176c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn                       uint32_t attrType = ResTable_map::TYPE_ANY,
2186c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn                       const String8* configTypeName = NULL,
2196c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn                       const ConfigDescription* config = NULL);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t assignResourceIds();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addLocalization(const String16& name, const String8& locale);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t validateLocalizations(void);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t flatten(Bundle*, const sp<AaptFile>& dest);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writePublicDefinitions(const String16& package, FILE* fp);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getCustomResource(const String16& package,
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       const String16& type,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       const String16& name) const;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getCustomResourceWithCreation(const String16& package,
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const String16& type,
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const String16& name,
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   const bool createIfNeeded);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeEnum(uint32_t attrID,
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  const char16_t* name, size_t nameLen,
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  Res_value* outValue);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getAttributeFlags(uint32_t attrID,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   const char16_t* name, size_t nameLen,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   Res_value* outValue);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t getAttributeL10N(uint32_t attrID);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool getLocalizationSetting();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void reportError(void* accessorCookie, const char* fmt, ...);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Item {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            { memset(&parsedValue, 0, sizeof(parsedValue)); }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item(const SourcePos& pos,
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             bool _isId,
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             const String16& _value,
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             const Vector<StringPool::entry_style_span>* _style = NULL,
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             int32_t format = ResTable_map::TYPE_ANY);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item(const Item& o) : sourcePos(o.sourcePos),
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            isId(o.isId), value(o.value), style(o.style),
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            memset(&parsedValue, 0, sizeof(parsedValue));
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ~Item() { }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item& operator=(const Item& o) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sourcePos = o.sourcePos;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            isId = o.isId;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = o.value;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            style = o.style;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            format = o.format;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bagKeyId = o.bagKeyId;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parsedValue = o.parsedValue;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos                               sourcePos;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable bool                            isId;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16                                value;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<StringPool::entry_style_span>    style;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t                                 format;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t                                bagKeyId;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable bool                            evaluating;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Res_value                               parsedValue;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Entry : public RefBase {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Entry(const String16& name, const SourcePos& pos)
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : mName(name), mType(TYPE_UNKNOWN),
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Entry() { }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enum type {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_UNKNOWN = 0,
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_ITEM,
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TYPE_BAG
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type getType() const { return mType; }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setParent(const String16& parent) { mParent = parent; }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getParent() const { return mParent; }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t makeItABag(const SourcePos& sourcePos);
3134b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt
3144b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt        status_t emptyBag(const SourcePos& sourcePos);
3154b4f4a908895bc0ba63f929bfdc02eec22c0f6e5Robert Greenwalt
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setItem(const SourcePos& pos,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const String16& value,
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const Vector<StringPool::entry_style_span>* style = NULL,
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         int32_t format = ResTable_map::TYPE_ANY,
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const bool overwrite = false);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t addToBag(const SourcePos& pos,
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          const String16& key, const String16& value,
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          const Vector<StringPool::entry_style_span>* style = NULL,
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          bool replace=false, bool isId = false,
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          int32_t format = ResTable_map::TYPE_ANY);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Index of the entry's name string in the key pool.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getNameIndex() const { return mNameIndex; }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setNameIndex(int32_t index) { mNameIndex = index; }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const KeyedVector<String16, Item>& getBag() const { return mBag; }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t generateAttributes(ResourceTable* table,
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const String16& package);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t assignResourceIds(ResourceTable* table,
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   const String16& package);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3416c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        status_t prepareFlatten(StringPool* strings, ResourceTable* table,
3426c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn               const String8* configTypeName, const ConfigDescription* config);
3436c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn
3446c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn        status_t remapStringValue(StringPool* strings);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mName;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mParent;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type mType;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Item mItem;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mItemFormat;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyedVector<String16, Item> mBag;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mNameIndex;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t mParentId;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPos;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class ConfigList : public RefBase {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ConfigList(const String16& name, const SourcePos& pos)
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~ConfigList() { }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void appendComment(const String16& comment, bool onlyIfEmpty = false);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16& getComment() const { return mComment; }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void appendTypeComment(const String16& comment);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16& getTypeComment() const { return mTypeComment; }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Index of this entry in its Type.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getEntryIndex() const { return mEntryIndex; }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setEntryIndex(int32_t index) { mEntryIndex = index; }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setPublic(bool pub) { mPublic = pub; }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool getPublic() const { return mPublic; }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEntries.add(config, entry);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16 mName;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos mPos;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mComment;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mTypeComment;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool mPublic;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPublicSourcePos;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mEntryIndex;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Public {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public() : sourcePos(), ident(0) { }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public(const SourcePos& pos,
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               const String16& _comment,
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               uint32_t _ident)
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            : sourcePos(pos),
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment(_comment), ident(_ident) { }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public(const Public& o) : sourcePos(o.sourcePos),
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment(o.comment), ident(o.ident) { }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ~Public() { }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Public& operator=(const Public& o) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sourcePos = o.sourcePos;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comment = o.comment;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ident = o.ident;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return *this;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos   sourcePos;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16    comment;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t    ident;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Type : public RefBase {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Type(const String16& name, const SourcePos& pos)
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Type() { delete mFirstPublicSourcePos; }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t addPublic(const SourcePos& pos,
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const String16& name,
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const uint32_t ident);
43658c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
43758c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        void canAddEntry(const String16& name);
43858c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<Entry> getEntry(const String16& entry,
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const SourcePos& pos,
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           const ResTable_config* config = NULL,
443f878e2d80c3a0afefe3b018d232df6066379e1d5Robert Greenwalt                           bool doSetIndex = false,
44499080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                           bool overlay = false,
44599080c7d9ad9e5ccfec70dd10e4c24468a960c45Xavier Ducrohet                           bool autoAddOverlay = false);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getPublicIndex() const { return mPublicIndex; }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t getIndex() const { return mIndex; }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void setIndex(int32_t index) { mIndex = index; }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t applyPublicEntryOrder();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SortedVector<ConfigDescription>& getUniqueConfigs() const { return mUniqueConfigs; }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46158c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; }
46258c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const SourcePos& getPos() const { return mPos; }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 mName;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos* mFirstPublicSourcePos;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, Public> mPublic;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector<ConfigDescription> mUniqueConfigs;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<sp<ConfigList> > mOrderedConfigs;
47158c27a0a03f573791935116fa35f6a7c8bf93896Dianne Hackborn        SortedVector<String16> mCanAddEntries;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mPublicIndex;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t mIndex;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SourcePos mPos;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Package : public RefBase {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package(const String16& name, ssize_t includedId=-1);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~Package() { }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String16 getName() const { return mName; }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<Type> getType(const String16& type,
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         const SourcePos& pos,
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         bool doSetIndex = false);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t getAssignedId() const { return mIncludedId; }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setTypeStrings(const sp<AaptFile>& data);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setKeyStrings(const sp<AaptFile>& data);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t applyPublicTypeOrder();
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t setStrings(const sp<AaptFile>& data,
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ResStringPool* strings,
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            DefaultKeyedVector<String16, uint32_t>* mappings);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String16 mName;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const ssize_t mIncludedId;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, sp<Type> > mTypes;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<sp<Type> > mOrderedTypes;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> mTypeStringsData;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> mKeyStringsData;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ResStringPool mTypeStrings;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ResStringPool mKeyStrings;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Package> getPackage(const String16& package);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Type> getType(const String16& package,
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     const String16& type,
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     const SourcePos& pos,
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     bool doSetIndex = false);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Entry> getEntry(const String16& package,
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& type,
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const String16& name,
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const SourcePos& pos,
532f878e2d80c3a0afefe3b018d232df6066379e1d5Robert Greenwalt                       bool overlay,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       const ResTable_config* config = NULL,
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       bool doSetIndex = false);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<const Entry> getEntry(uint32_t resID,
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             const ResTable_config* config = NULL) const;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const Item* getItem(uint32_t resID, uint32_t attrID) const;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool getItemValue(uint32_t resID, uint32_t attrID,
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      Res_value* outValue);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 mAssetsPackage;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptAssets> mAssets;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DefaultKeyedVector<String16, sp<Package> > mPackages;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<sp<Package> > mOrderedPackages;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mNextPackageId;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mHaveAppPackage;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mIsAppPackage;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t mNumLocal;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SourcePos mCurrentXmlPos;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle* mBundle;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // key = string resource name, value = set of locales in which that name is defined
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    map<String16, set<String8> > mLocalizations;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
558