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