ResourceTable.h revision 62da8461ed5317fe78ae5e3793662694e7fc99a3
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2006 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Build resource files from raw assets.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef RESOURCE_TABLE_H
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RESOURCE_TABLE_H
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "StringPool.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SourcePos.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using namespace std;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XMLNode;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceTable;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum {
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    XML_COMPILE_STRIP_COMMENTS = 1<<0,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_COMPILE_STRIP_WHITESPACE = 1<<3,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_COMPILE_STANDARD_RESOURCE =
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)status_t compileXmlFile(const sp<AaptAssets>& assets,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const sp<AaptFile>& target,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ResourceTable* table,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int options = XML_COMPILE_STANDARD_RESOURCE);
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)status_t compileXmlFile(const sp<AaptAssets>& assets,
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        const sp<XMLNode>& xmlTree,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        const sp<AaptFile>& target,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ResourceTable* table,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        int options = XML_COMPILE_STANDARD_RESOURCE);
438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)status_t compileResourceFile(Bundle* bundle,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const sp<AaptAssets>& assets,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const sp<AaptFile>& in,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const ResTable_config& defParams,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const bool overwrite,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ResourceTable* outTable);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AccessorCookie
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SourcePos sourcePos;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    String8 attr;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    String8 value;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        :sourcePos(p),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         attr(a),
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         value(v)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ResourceTable : public ResTable::Accessor
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    class Package;
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    class Type;
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    class Entry;
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ResourceTable(Bundle* bundle, const String16& assetsPackage);
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    status_t addPublic(const SourcePos& pos,
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const String16& package,
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const String16& type,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const String16& name,
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const uint32_t ident);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    status_t addEntry(const SourcePos& pos,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& package,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& type,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& name,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& value,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const Vector<StringPool::entry_style_span>* style = NULL,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const ResTable_config* params = NULL,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const bool doSetIndex = false,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const int32_t format = ResTable_map::TYPE_ANY,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const bool overwrite = false);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t startBag(const SourcePos& pos,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& package,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& type,
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    const String16& name,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& bagParent,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const ResTable_config* params = NULL,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool replace = false,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool isId = false);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t addBag(const SourcePos& pos,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& package,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const String16& type,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& name,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& bagParent,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& bagKey,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const String16& value,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const Vector<StringPool::entry_style_span>* style = NULL,
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    const ResTable_config* params = NULL,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    bool replace = false,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    bool isId = false,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const int32_t format = ResTable_map::TYPE_ANY);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool hasBagOrEntry(const String16& package,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16& type,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16& name) const;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool hasBagOrEntry(const String16& ref,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const String16* defType = NULL,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16* defPackage = NULL);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool appendComment(const String16& package,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16& type,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16& name,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const String16& comment,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       bool onlyIfEmpty = false);
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool appendTypeComment(const String16& package,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const String16& type,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const String16& name,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const String16& comment);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t size() const;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t numLocalResources() const;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool hasResources() const;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<AaptFile> flatten(Bundle*);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static inline uint32_t makeResId(uint32_t packageId,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     uint32_t typeId,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     uint32_t nameId)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return nameId | (typeId<<16) | (packageId<<24);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static inline uint32_t getResId(const sp<Package>& p,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const sp<Type>& t,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t nameId);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t getResId(const String16& package,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& type,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16& name,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool onlyPublic = false) const;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t getResId(const String16& ref,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16* defType = NULL,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const String16* defPackage = NULL,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const char** outErrorMsg = NULL,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool onlyPublic = false) const;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool isValidResourceName(const String16& s);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool stringToValue(Res_value* outValue, StringPool* pool,
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       const String16& str,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       bool preserveSpaces, bool coerceType,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       uint32_t attrID,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const Vector<StringPool::entry_style_span>* style = NULL,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       String16* outStr = NULL, void* accessorCookie = NULL,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       uint32_t attrType = ResTable_map::TYPE_ANY);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t assignResourceIds();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void addLocalization(const String16& name, const String8& locale);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t validateLocalizations(void);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t flatten(Bundle*, const sp<AaptFile>& dest);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void writePublicDefinitions(const String16& package, FILE* fp);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual uint32_t getCustomResource(const String16& package,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const String16& type,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const String16& name) const;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual uint32_t getCustomResourceWithCreation(const String16& package,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const String16& type,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const String16& name,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const bool createIfNeeded);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual bool getAttributeEnum(uint32_t attrID,
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  const char16_t* name, size_t nameLen,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Res_value* outValue);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getAttributeFlags(uint32_t attrID,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const char16_t* name, size_t nameLen,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Res_value* outValue);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual uint32_t getAttributeL10N(uint32_t attrID);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getLocalizationSetting();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void reportError(void* accessorCookie, const char* fmt, ...);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Item {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            { memset(&parsedValue, 0, sizeof(parsedValue)); }
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Item(const SourcePos& pos,
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             bool _isId,
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             const String16& _value,
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             const Vector<StringPool::entry_style_span>* _style = NULL,
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             int32_t format = ResTable_map::TYPE_ANY);
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Item(const Item& o) : sourcePos(o.sourcePos),
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            isId(o.isId), value(o.value), style(o.style),
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            memset(&parsedValue, 0, sizeof(parsedValue));
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ~Item() { }
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Item& operator=(const Item& o) {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            sourcePos = o.sourcePos;
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            isId = o.isId;
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            value = o.value;
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            style = o.style;
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            format = o.format;
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            bagKeyId = o.bagKeyId;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            parsedValue = o.parsedValue;
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return *this;
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        }
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SourcePos                               sourcePos;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mutable bool                            isId;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16                                value;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Vector<StringPool::entry_style_span>    style;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t                                 format;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t                                bagKeyId;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mutable bool                            evaluating;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Res_value                               parsedValue;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class Entry : public RefBase {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Entry(const String16& name, const SourcePos& pos)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            : mName(name), mType(TYPE_UNKNOWN),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual ~Entry() { }
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enum type {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            TYPE_UNKNOWN = 0,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            TYPE_ITEM,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            TYPE_BAG
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 getName() const { return mName; }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type getType() const { return mType; }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setParent(const String16& parent) { mParent = parent; }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 getParent() const { return mParent; }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t makeItABag(const SourcePos& sourcePos);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t emptyBag(const SourcePos& sourcePos);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t setItem(const SourcePos& pos,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const String16& value,
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const Vector<StringPool::entry_style_span>* style = NULL,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int32_t format = ResTable_map::TYPE_ANY,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const bool overwrite = false);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t addToBag(const SourcePos& pos,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const String16& key, const String16& value,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const Vector<StringPool::entry_style_span>* style = NULL,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool replace=false, bool isId = false,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int32_t format = ResTable_map::TYPE_ANY);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Index of the entry's name string in the key pool.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t getNameIndex() const { return mNameIndex; }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setNameIndex(int32_t index) { mNameIndex = index; }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        const KeyedVector<String16, Item>& getBag() const { return mBag; }
285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        status_t generateAttributes(ResourceTable* table,
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    const String16& package);
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        status_t assignResourceIds(ResourceTable* table,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const String16& package);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t prepareFlatten(StringPool* strings, ResourceTable* table);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SourcePos& getPos() const { return mPos; }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 mName;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 mParent;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type mType;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Item mItem;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t mItemFormat;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        KeyedVector<String16, Item> mBag;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t mNameIndex;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t mParentId;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SourcePos mPos;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct ConfigDescription : public ResTable_config {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigDescription() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            memset(this, 0, sizeof(*this));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size = sizeof(ResTable_config);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigDescription(const ResTable_config&o) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *static_cast<ResTable_config*>(this) = o;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size = sizeof(ResTable_config);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigDescription(const ConfigDescription&o) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            *static_cast<ResTable_config*>(this) = o;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigDescription& operator=(const ResTable_config& o) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *static_cast<ResTable_config*>(this) = o;
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            size = sizeof(ResTable_config);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return *this;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigDescription& operator=(const ConfigDescription& o) {
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            *static_cast<ResTable_config*>(this) = o;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return *this;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator<(const ConfigDescription& o) const { return compare(o) < 0; }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator<=(const ConfigDescription& o) const { return compare(o) <= 0; }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator==(const ConfigDescription& o) const { return compare(o) == 0; }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator!=(const ConfigDescription& o) const { return compare(o) != 0; }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator>=(const ConfigDescription& o) const { return compare(o) >= 0; }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inline bool operator>(const ConfigDescription& o) const { return compare(o) > 0; }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class ConfigList : public RefBase {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ConfigList(const String16& name, const SourcePos& pos)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual ~ConfigList() { }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 getName() const { return mName; }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SourcePos& getPos() const { return mPos; }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void appendComment(const String16& comment, bool onlyIfEmpty = false);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const String16& getComment() const { return mComment; }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void appendTypeComment(const String16& comment);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const String16& getTypeComment() const { return mTypeComment; }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Index of this entry in its Type.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t getEntryIndex() const { return mEntryIndex; }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setEntryIndex(int32_t index) { mEntryIndex = index; }
3598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        void setPublic(bool pub) { mPublic = pub; }
3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        bool getPublic() const { return mPublic; }
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mEntries.add(config, entry);
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    private:
3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        const String16 mName;
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const SourcePos mPos;
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        String16 mComment;
3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        String16 mTypeComment;
3758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        bool mPublic;
3768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        SourcePos mPublicSourcePos;
3778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        int32_t mEntryIndex;
3788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
3798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
3808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    class Public {
3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    public:
3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Public() : sourcePos(), ident(0) { }
3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Public(const SourcePos& pos,
3858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               const String16& _comment,
3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               uint32_t _ident)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            : sourcePos(pos),
3888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            comment(_comment), ident(_ident) { }
3898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Public(const Public& o) : sourcePos(o.sourcePos),
3908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            comment(o.comment), ident(o.ident) { }
3918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        ~Public() { }
3928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        Public& operator=(const Public& o) {
3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            sourcePos = o.sourcePos;
3958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            comment = o.comment;
3968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            ident = o.ident;
3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            return *this;
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SourcePos   sourcePos;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16    comment;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t    ident;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class Type : public RefBase {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Type(const String16& name, const SourcePos& pos)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        { }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual ~Type() { delete mFirstPublicSourcePos; }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_t addPublic(const SourcePos& pos,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const String16& name,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint32_t ident);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String16 getName() const { return mName; }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sp<Entry> getEntry(const String16& entry,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const SourcePos& pos,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const ResTable_config* config = NULL,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool doSetIndex = false);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int32_t getPublicIndex() const { return mPublicIndex; }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        int32_t getIndex() const { return mIndex; }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setIndex(int32_t index) { mIndex = index; }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        status_t applyPublicEntryOrder();
43058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
43168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const SortedVector<ConfigDescription>& getUniqueConfigs() const { return mUniqueConfigs; }
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
43368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
43568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
43668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const SourcePos& getPos() const { return mPos; }
43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    private:
43868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        String16 mName;
43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        SourcePos* mFirstPublicSourcePos;
44068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        DefaultKeyedVector<String16, Public> mPublic;
44168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        SortedVector<ConfigDescription> mUniqueConfigs;
44268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        Vector<sp<ConfigList> > mOrderedConfigs;
44468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        int32_t mPublicIndex;
44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        int32_t mIndex;
44668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        SourcePos mPos;
44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    };
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    class Package : public RefBase {
450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    public:
451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        Package(const String16& name, ssize_t includedId=-1);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual ~Package() { }
45323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
45423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        String16 getName() const { return mName; }
45523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        sp<Type> getType(const String16& type,
45623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         const SourcePos& pos,
45723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         bool doSetIndex = false);
45823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
45923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        ssize_t getAssignedId() const { return mIncludedId; }
46023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
46323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
46423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        status_t setTypeStrings(const sp<AaptFile>& data);
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
46723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
46823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
46923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        status_t setKeyStrings(const sp<AaptFile>& data);
47023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
47123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        status_t applyPublicTypeOrder();
47223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
47323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
475424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    private:
477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        status_t setStrings(const sp<AaptFile>& data,
478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            ResStringPool* strings,
479424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            DefaultKeyedVector<String16, uint32_t>* mappings);
480424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
481424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        const String16 mName;
482424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        const ssize_t mIncludedId;
483424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        DefaultKeyedVector<String16, sp<Type> > mTypes;
484424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        Vector<sp<Type> > mOrderedTypes;
485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        sp<AaptFile> mTypeStringsData;
486424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        sp<AaptFile> mKeyStringsData;
487424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ResStringPool mTypeStrings;
488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ResStringPool mKeyStrings;
489424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
490424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    };
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
493424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)private:
494424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
495424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    sp<Package> getPackage(const String16& package);
496424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    sp<Type> getType(const String16& package,
497424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     const String16& type,
498424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     const SourcePos& pos,
499424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     bool doSetIndex = false);
500424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    sp<Entry> getEntry(const String16& package,
501424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                       const String16& type,
502424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                       const String16& name,
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const SourcePos& pos,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const ResTable_config* config = NULL,
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       bool doSetIndex = false);
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sp<const Entry> getEntry(uint32_t resID,
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             const ResTable_config* config = NULL) const;
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const Item* getItem(uint32_t resID, uint32_t attrID) const;
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool getItemValue(uint32_t resID, uint32_t attrID,
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      Res_value* outValue);
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    String16 mAssetsPackage;
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sp<AaptAssets> mAssets;
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DefaultKeyedVector<String16, sp<Package> > mPackages;
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Vector<sp<Package> > mOrderedPackages;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mNextPackageId;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool mHaveAppPackage;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool mIsAppPackage;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t mNumLocal;
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SourcePos mCurrentXmlPos;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Bundle* mBundle;
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // key = string resource name, value = set of locales in which that name is defined
525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    map<String16, set<String8> > mLocalizations;
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceFilter
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResourceFilter() : mData(), mContainsPseudo(false) {}
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_t parse(const char* arg);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool match(int axis, uint32_t value);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool match(const ResTable_config& config);
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    inline bool containsPseudo() { return mContainsPseudo; }
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeyedVector<int,SortedVector<uint32_t> > mData;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool mContainsPseudo;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)