auto import from //depot/cupcake/@135843
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
new file mode 100644
index 0000000..e8fbd9b
--- /dev/null
+++ b/tools/aapt/ResourceTable.h
@@ -0,0 +1,534 @@
+//
+// Copyright 2006 The Android Open Source Project
+//
+// Build resource files from raw assets.
+//
+
+#ifndef RESOURCE_TABLE_H
+#define RESOURCE_TABLE_H
+
+#include "StringPool.h"
+#include "SourcePos.h"
+
+#include <set>
+#include <map>
+
+using namespace std;
+
+class ResourceTable;
+
+enum {
+    XML_COMPILE_STRIP_COMMENTS = 1<<0,
+    XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1,
+    XML_COMPILE_COMPACT_WHITESPACE = 1<<2,
+    XML_COMPILE_STRIP_WHITESPACE = 1<<3,
+    XML_COMPILE_STRIP_RAW_VALUES = 1<<4,
+    
+    XML_COMPILE_STANDARD_RESOURCE =
+            XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
+            | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
+};
+
+status_t compileXmlFile(const sp<AaptAssets>& assets,
+                        const sp<AaptFile>& target,
+                        ResourceTable* table,
+                        int options = XML_COMPILE_STANDARD_RESOURCE);
+
+status_t compileResourceFile(Bundle* bundle,
+                             const sp<AaptAssets>& assets,
+                             const sp<AaptFile>& in,
+                             const ResTable_config& defParams,
+                             const bool overwrite,
+                             ResourceTable* outTable);
+
+struct AccessorCookie
+{
+    SourcePos sourcePos;
+    String8 attr;
+    String8 value;
+
+    AccessorCookie(const SourcePos&p, const String8& a, const String8& v)
+        :sourcePos(p),
+         attr(a),
+         value(v)
+    {
+    }
+};
+
+class ResourceTable : public ResTable::Accessor
+{
+public:
+    class Package;
+    class Type;
+    class Entry;
+
+    ResourceTable(Bundle* bundle, const String16& assetsPackage);
+
+    status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
+
+    status_t addPublic(const SourcePos& pos,
+                       const String16& package,
+                       const String16& type,
+                       const String16& name,
+                       const uint32_t ident);
+
+    status_t addEntry(const SourcePos& pos,
+                      const String16& package,
+                      const String16& type,
+                      const String16& name,
+                      const String16& value,
+                      const Vector<StringPool::entry_style_span>* style = NULL,
+                      const ResTable_config* params = NULL,
+                      const bool doSetIndex = false,
+                      const int32_t format = ResTable_map::TYPE_ANY,
+                      const bool overwrite = false);
+
+    status_t startBag(const SourcePos& pos,
+                    const String16& package,
+                    const String16& type,
+                    const String16& name,
+                    const String16& bagParent,
+                    const ResTable_config* params = NULL,
+                    bool replace = false,
+                    bool isId = false);
+    
+    status_t addBag(const SourcePos& pos,
+                    const String16& package,
+                    const String16& type,
+                    const String16& name,
+                    const String16& bagParent,
+                    const String16& bagKey,
+                    const String16& value,
+                    const Vector<StringPool::entry_style_span>* style = NULL,
+                    const ResTable_config* params = NULL,
+                    bool replace = false,
+                    bool isId = false,
+                    const int32_t format = ResTable_map::TYPE_ANY);
+
+    bool hasBagOrEntry(const String16& package,
+                       const String16& type,
+                       const String16& name) const;
+
+    bool hasBagOrEntry(const String16& ref,
+                       const String16* defType = NULL,
+                       const String16* defPackage = NULL);
+
+    bool appendComment(const String16& package,
+                       const String16& type,
+                       const String16& name,
+                       const String16& comment,
+                       bool onlyIfEmpty = false);
+
+    bool appendTypeComment(const String16& package,
+                           const String16& type,
+                           const String16& name,
+                           const String16& comment);
+    
+    size_t size() const;
+    size_t numLocalResources() const;
+    bool hasResources() const;
+
+    sp<AaptFile> flatten(Bundle*);
+
+    static inline uint32_t makeResId(uint32_t packageId,
+                                     uint32_t typeId,
+                                     uint32_t nameId)
+    {
+        return nameId | (typeId<<16) | (packageId<<24);
+    }
+
+    static inline uint32_t getResId(const sp<Package>& p,
+                                    const sp<Type>& t,
+                                    uint32_t nameId);
+
+    uint32_t getResId(const String16& package,
+                      const String16& type,
+                      const String16& name,
+                      bool onlyPublic = false) const;
+
+    uint32_t getResId(const String16& ref,
+                      const String16* defType = NULL,
+                      const String16* defPackage = NULL,
+                      const char** outErrorMsg = NULL,
+                      bool onlyPublic = false) const;
+
+    static bool isValidResourceName(const String16& s);
+    
+    bool stringToValue(Res_value* outValue, StringPool* pool,
+                       const String16& str,
+                       bool preserveSpaces, bool coerceType,
+                       uint32_t attrID,
+                       const Vector<StringPool::entry_style_span>* style = NULL,
+                       String16* outStr = NULL, void* accessorCookie = NULL,
+                       uint32_t attrType = ResTable_map::TYPE_ANY);
+
+    status_t assignResourceIds();
+    status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL);
+    void addLocalization(const String16& name, const String8& locale);
+    status_t validateLocalizations(void);
+
+    status_t flatten(Bundle*, const sp<AaptFile>& dest);
+
+    void writePublicDefinitions(const String16& package, FILE* fp);
+
+    virtual uint32_t getCustomResource(const String16& package,
+                                       const String16& type,
+                                       const String16& name) const;
+    virtual uint32_t getCustomResourceWithCreation(const String16& package,
+                                                   const String16& type,
+                                                   const String16& name,
+                                                   const bool createIfNeeded);
+    virtual uint32_t getRemappedPackage(uint32_t origPackage) const;
+    virtual bool getAttributeType(uint32_t attrID, uint32_t* outType);
+    virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin);
+    virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax);
+    virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys);
+    virtual bool getAttributeEnum(uint32_t attrID,
+                                  const char16_t* name, size_t nameLen,
+                                  Res_value* outValue);
+    virtual bool getAttributeFlags(uint32_t attrID,
+                                   const char16_t* name, size_t nameLen,
+                                   Res_value* outValue);
+    virtual uint32_t getAttributeL10N(uint32_t attrID);
+
+    virtual bool getLocalizationSetting();
+    virtual void reportError(void* accessorCookie, const char* fmt, ...);
+
+    void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; }
+
+    class Item {
+    public:
+        Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false)
+            { memset(&parsedValue, 0, sizeof(parsedValue)); }
+        Item(const SourcePos& pos,
+             bool _isId,
+             const String16& _value,
+             const Vector<StringPool::entry_style_span>* _style = NULL,
+             int32_t format = ResTable_map::TYPE_ANY);
+        Item(const Item& o) : sourcePos(o.sourcePos),
+            isId(o.isId), value(o.value), style(o.style),
+            format(o.format), bagKeyId(o.bagKeyId), evaluating(false) {
+            memset(&parsedValue, 0, sizeof(parsedValue));
+        }
+        ~Item() { }
+
+        Item& operator=(const Item& o) {
+            sourcePos = o.sourcePos;
+            isId = o.isId;
+            value = o.value;
+            style = o.style;
+            format = o.format;
+            bagKeyId = o.bagKeyId;
+            parsedValue = o.parsedValue;
+            return *this;
+        }
+
+        SourcePos                               sourcePos;
+        mutable bool                            isId;
+        String16                                value;
+        Vector<StringPool::entry_style_span>    style;
+        int32_t                                 format;
+        uint32_t                                bagKeyId;
+        mutable bool                            evaluating;
+        Res_value                               parsedValue;
+    };
+
+    class Entry : public RefBase {
+    public:
+        Entry(const String16& name, const SourcePos& pos)
+            : mName(name), mType(TYPE_UNKNOWN),
+              mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
+        { }
+        virtual ~Entry() { }
+
+        enum type {
+            TYPE_UNKNOWN = 0,
+            TYPE_ITEM,
+            TYPE_BAG
+        };
+        
+        String16 getName() const { return mName; }
+        type getType() const { return mType; }
+
+        void setParent(const String16& parent) { mParent = parent; }
+        String16 getParent() const { return mParent; }
+
+        status_t makeItABag(const SourcePos& sourcePos);
+        
+        status_t setItem(const SourcePos& pos,
+                         const String16& value,
+                         const Vector<StringPool::entry_style_span>* style = NULL,
+                         int32_t format = ResTable_map::TYPE_ANY,
+                         const bool overwrite = false);
+
+        status_t addToBag(const SourcePos& pos,
+                          const String16& key, const String16& value,
+                          const Vector<StringPool::entry_style_span>* style = NULL,
+                          bool replace=false, bool isId = false,
+                          int32_t format = ResTable_map::TYPE_ANY);
+
+        // Index of the entry's name string in the key pool.
+        int32_t getNameIndex() const { return mNameIndex; }
+        void setNameIndex(int32_t index) { mNameIndex = index; }
+
+        const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; }
+        const KeyedVector<String16, Item>& getBag() const { return mBag; }
+
+        status_t generateAttributes(ResourceTable* table,
+                                    const String16& package);
+
+        status_t assignResourceIds(ResourceTable* table,
+                                   const String16& package);
+
+        status_t prepareFlatten(StringPool* strings, ResourceTable* table);
+
+        ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic);
+
+        const SourcePos& getPos() const { return mPos; }
+
+    private:
+        String16 mName;
+        String16 mParent;
+        type mType;
+        Item mItem;
+        int32_t mItemFormat;
+        KeyedVector<String16, Item> mBag;
+        int32_t mNameIndex;
+        uint32_t mParentId;
+        SourcePos mPos;
+    };
+
+    struct ConfigDescription : public ResTable_config {
+        ConfigDescription() {
+            memset(this, 0, sizeof(*this));
+            size = sizeof(ResTable_config);
+        }
+        ConfigDescription(const ResTable_config&o) {
+            *static_cast<ResTable_config*>(this) = o;
+            size = sizeof(ResTable_config);
+        }
+        ConfigDescription(const ConfigDescription&o) {
+            *static_cast<ResTable_config*>(this) = o;
+        }
+        
+        ConfigDescription& operator=(const ResTable_config& o) {
+            *static_cast<ResTable_config*>(this) = o;
+            size = sizeof(ResTable_config);
+            return *this;
+        }
+        ConfigDescription& operator=(const ConfigDescription& o) {
+            *static_cast<ResTable_config*>(this) = o;
+            return *this;
+        }
+        
+        inline bool operator<(const ConfigDescription& o) const { return compare(o) < 0; }
+        inline bool operator<=(const ConfigDescription& o) const { return compare(o) <= 0; }
+        inline bool operator==(const ConfigDescription& o) const { return compare(o) == 0; }
+        inline bool operator!=(const ConfigDescription& o) const { return compare(o) != 0; }
+        inline bool operator>=(const ConfigDescription& o) const { return compare(o) >= 0; }
+        inline bool operator>(const ConfigDescription& o) const { return compare(o) > 0; }
+    };
+    
+    class ConfigList : public RefBase {
+    public:
+        ConfigList(const String16& name, const SourcePos& pos)
+            : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { }
+        virtual ~ConfigList() { }
+        
+        String16 getName() const { return mName; }
+        const SourcePos& getPos() const { return mPos; }
+        
+        void appendComment(const String16& comment, bool onlyIfEmpty = false);
+        const String16& getComment() const { return mComment; }
+        
+        void appendTypeComment(const String16& comment);
+        const String16& getTypeComment() const { return mTypeComment; }
+        
+        // Index of this entry in its Type.
+        int32_t getEntryIndex() const { return mEntryIndex; }
+        void setEntryIndex(int32_t index) { mEntryIndex = index; }
+        
+        void setPublic(bool pub) { mPublic = pub; }
+        bool getPublic() const { return mPublic; }
+        void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; }
+        const SourcePos& getPublicSourcePos() { return mPublicSourcePos; }
+        
+        void addEntry(const ResTable_config& config, const sp<Entry>& entry) {
+            mEntries.add(config, entry);
+        }
+        
+        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
+    private:
+        const String16 mName;
+        const SourcePos mPos;
+        String16 mComment;
+        String16 mTypeComment;
+        bool mPublic;
+        SourcePos mPublicSourcePos;
+        int32_t mEntryIndex;
+        DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries;
+    };
+    
+    class Public {
+    public:
+        Public() : sourcePos(), ident(0) { }
+        Public(const SourcePos& pos,
+               const String16& _comment,
+               uint32_t _ident)
+            : sourcePos(pos),
+            comment(_comment), ident(_ident) { }
+        Public(const Public& o) : sourcePos(o.sourcePos),
+            comment(o.comment), ident(o.ident) { }
+        ~Public() { }
+        
+        Public& operator=(const Public& o) {
+            sourcePos = o.sourcePos;
+            comment = o.comment;
+            ident = o.ident;
+            return *this;
+        }
+        
+        SourcePos   sourcePos;
+        String16    comment;
+        uint32_t    ident;
+    };
+    
+    class Type : public RefBase {
+    public:
+        Type(const String16& name, const SourcePos& pos)
+                : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos)
+        { }
+        virtual ~Type() { delete mFirstPublicSourcePos; }
+
+        status_t addPublic(const SourcePos& pos,
+                           const String16& name,
+                           const uint32_t ident);
+
+        String16 getName() const { return mName; }
+        sp<Entry> getEntry(const String16& entry,
+                           const SourcePos& pos,
+                           const ResTable_config* config = NULL,
+                           bool doSetIndex = false);
+
+        const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; }
+
+        int32_t getPublicIndex() const { return mPublicIndex; }
+
+        int32_t getIndex() const { return mIndex; }
+        void setIndex(int32_t index) { mIndex = index; }
+
+        status_t applyPublicEntryOrder();
+
+        const SortedVector<ConfigDescription>& getUniqueConfigs() const { return mUniqueConfigs; }
+        
+        const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; }
+        const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; }
+
+        const SourcePos& getPos() const { return mPos; }
+    private:
+        String16 mName;
+        SourcePos* mFirstPublicSourcePos;
+        DefaultKeyedVector<String16, Public> mPublic;
+        SortedVector<ConfigDescription> mUniqueConfigs;
+        DefaultKeyedVector<String16, sp<ConfigList> > mConfigs;
+        Vector<sp<ConfigList> > mOrderedConfigs;
+        int32_t mPublicIndex;
+        int32_t mIndex;
+        SourcePos mPos;
+    };
+
+    class Package : public RefBase {
+    public:
+        Package(const String16& name, ssize_t includedId=-1);
+        virtual ~Package() { }
+
+        String16 getName() const { return mName; }
+        sp<Type> getType(const String16& type,
+                         const SourcePos& pos,
+                         bool doSetIndex = false);
+
+        ssize_t getAssignedId() const { return mIncludedId; }
+
+        const ResStringPool& getTypeStrings() const { return mTypeStrings; }
+        uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); }
+        const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; }
+        status_t setTypeStrings(const sp<AaptFile>& data);
+
+        const ResStringPool& getKeyStrings() const { return mKeyStrings; }
+        uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); }
+        const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; }
+        status_t setKeyStrings(const sp<AaptFile>& data);
+
+        status_t applyPublicTypeOrder();
+
+        const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; }
+        const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; }
+
+    private:
+        status_t setStrings(const sp<AaptFile>& data,
+                            ResStringPool* strings,
+                            DefaultKeyedVector<String16, uint32_t>* mappings);
+
+        const String16 mName;
+        const ssize_t mIncludedId;
+        DefaultKeyedVector<String16, sp<Type> > mTypes;
+        Vector<sp<Type> > mOrderedTypes;
+        sp<AaptFile> mTypeStringsData;
+        sp<AaptFile> mKeyStringsData;
+        ResStringPool mTypeStrings;
+        ResStringPool mKeyStrings;
+        DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping;
+        DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping;
+    };
+
+private:
+    void writePublicDefinitions(const String16& package, FILE* fp, bool pub);
+    sp<Package> getPackage(const String16& package);
+    sp<Type> getType(const String16& package,
+                     const String16& type,
+                     const SourcePos& pos,
+                     bool doSetIndex = false);
+    sp<Entry> getEntry(const String16& package,
+                       const String16& type,
+                       const String16& name,
+                       const SourcePos& pos,
+                       const ResTable_config* config = NULL,
+                       bool doSetIndex = false);
+    sp<const Entry> getEntry(uint32_t resID,
+                             const ResTable_config* config = NULL) const;
+    const Item* getItem(uint32_t resID, uint32_t attrID) const;
+    bool getItemValue(uint32_t resID, uint32_t attrID,
+                      Res_value* outValue);
+
+
+    String16 mAssetsPackage;
+    sp<AaptAssets> mAssets;
+    DefaultKeyedVector<String16, sp<Package> > mPackages;
+    Vector<sp<Package> > mOrderedPackages;
+    uint32_t mNextPackageId;
+    bool mHaveAppPackage;
+    bool mIsAppPackage;
+    size_t mNumLocal;
+    SourcePos mCurrentXmlPos;
+    Bundle* mBundle;
+    
+    // key = string resource name, value = set of locales in which that name is defined
+    map<String16, set<String8> > mLocalizations;
+};
+
+class ResourceFilter
+{
+public:
+    ResourceFilter() : mData(), mContainsPseudo(false) {}
+    status_t parse(const char* arg);
+    bool match(int axis, uint32_t value);
+    bool match(const ResTable_config& config);
+    inline bool containsPseudo() { return mContainsPseudo; }
+
+private:
+    KeyedVector<int,SortedVector<uint32_t> > mData;
+    bool mContainsPseudo;
+};
+
+
+#endif