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