1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2006 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Build resource files from raw assets. 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef RESOURCE_TABLE_H 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define RESOURCE_TABLE_H 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <map> 11e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski#include <queue> 12e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski#include <set> 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 14de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "ConfigDescription.h" 15de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "ResourceFilter.h" 16de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "SourcePos.h" 17de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "StringPool.h" 18de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski#include "Symbol.h" 19de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass XMLNode; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum { 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XML_COMPILE_STRIP_COMMENTS = 1<<0, 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XML_COMPILE_ASSIGN_ATTRIBUTE_IDS = 1<<1, 2607dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_PARSE_VALUES = 1 << 2, 2707dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_COMPACT_WHITESPACE = 1<<3, 2807dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_STRIP_WHITESPACE = 1<<4, 2907dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_STRIP_RAW_VALUES = 1<<5, 3007dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_UTF8 = 1<<6, 31030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XML_COMPILE_STANDARD_RESOURCE = 3307dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski XML_COMPILE_STRIP_COMMENTS | XML_COMPILE_ASSIGN_ATTRIBUTE_IDS | XML_COMPILE_PARSE_VALUES 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski | XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 37e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle, 38e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const sp<AaptAssets>& assets, 39e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& resourceName, 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile>& target, 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceTable* table, 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int options = XML_COMPILE_STANDARD_RESOURCE); 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 44e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle, 45e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const sp<AaptAssets>& assets, 46e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& resourceName, 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile>& target, 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile>& outTarget, 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceTable* table, 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int options = XML_COMPILE_STANDARD_RESOURCE); 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 52e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistatus_t compileXmlFile(const Bundle* bundle, 53e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const sp<AaptAssets>& assets, 54e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& resourceName, 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<XMLNode>& xmlTree, 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile>& target, 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceTable* table, 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int options = XML_COMPILE_STANDARD_RESOURCE); 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t compileResourceFile(Bundle* bundle, 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptAssets>& assets, 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile>& in, 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config& defParams, 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const bool overwrite, 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceTable* outTable); 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct AccessorCookie 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{ 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos sourcePos; 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 attr; 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 value; 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski AccessorCookie(const SourcePos&p, const String8& a, const String8& v) 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski :sourcePos(p), 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski attr(a), 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski value(v) 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 81e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// Holds the necessary information to compile the 82e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski// resource. 83e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinskistruct CompileResourceWorkItem { 84e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski String16 resourceName; 85e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski String8 resPath; 86e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski sp<AaptFile> file; 8707dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski sp<XMLNode> xmlRoot; 8807dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski bool needsCompiling = true; 89e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski}; 90e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ResourceTable : public ResTable::Accessor 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{ 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 94833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski // The type of package to build. 95833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski enum PackageType { 96833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski App, 97833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski System, 98833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski SharedLibrary, 99833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski AppFeature 100833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski }; 101833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Package; 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Type; 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Entry; 105beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski class ConfigList; 106beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski 107beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski /** 108beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski * Exposed for testing. Determines whether a versioned resource should be generated 109beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski * based on the other available configurations for that resource. 110beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski */ 111beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski static bool shouldGenerateVersionedResource(const sp<ConfigList>& configList, 112beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski const ConfigDescription& sourceConfig, 113beb9e33bfb79847c25aac98e39f3ea620a953ef7Adam Lesinski const int sdkVersionToGenerate); 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 115833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski ResourceTable(Bundle* bundle, const String16& assetsPackage, PackageType type); 116833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski 117833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski const String16& getAssetsPackage() const { 118833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski return mAssetsPackage; 119833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski } 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 121e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski /** 122e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * Returns the queue of resources that need to be compiled. 123e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * This is only used for resources that have been generated 124e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * during the compilation phase. If they were just added 125e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * to the AaptAssets, then they may be skipped over 126e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * and would mess up iteration order for the existing 127e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski * resources. 128e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski */ 129030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert std::queue<CompileResourceWorkItem>& getWorkQueue() { 130e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski return mWorkQueue; 131e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski } 132e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets); 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addPublic(const SourcePos& pos, 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package, 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const uint32_t ident); 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addEntry(const SourcePos& pos, 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package, 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& value, 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* style = NULL, 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* params = NULL, 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const bool doSetIndex = false, 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const int32_t format = ResTable_map::TYPE_ANY, 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const bool overwrite = false); 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t startBag(const SourcePos& pos, 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package, 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& bagParent, 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* params = NULL, 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool overlay = false, 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool replace = false, 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool isId = false); 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addBag(const SourcePos& pos, 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package, 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& bagParent, 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& bagKey, 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& value, 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* style = NULL, 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* params = NULL, 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool replace = false, 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool isId = false, 173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const int32_t format = ResTable_map::TYPE_ANY); 174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool hasBagOrEntry(const String16& package, 176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name) const; 178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool hasBagOrEntry(const String16& package, 180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config& config) const; 183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool hasBagOrEntry(const String16& ref, 185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16* defType = NULL, 186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16* defPackage = NULL); 187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool appendComment(const String16& package, 189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& comment, 192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool onlyIfEmpty = false); 193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool appendTypeComment(const String16& package, 195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& comment); 198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void canAddEntry(const SourcePos& pos, 200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package, const String16& type, const String16& name); 201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t size() const; 203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t numLocalResources() const; 204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool hasResources() const; 205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 206cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski bool versionForCompat(const Bundle* bundle, const String16& resourceName, 207cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski const sp<AaptFile>& file, const sp<XMLNode>& root); 208cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski 20982a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski status_t modifyForCompat(const Bundle* bundle); 210e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski status_t modifyForCompat(const Bundle* bundle, 211e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& resourceName, 212e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const sp<AaptFile>& file, 213e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const sp<XMLNode>& root); 21482a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski 21507dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski status_t processBundleFormat(const Bundle* bundle, 21607dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const String16& resourceName, 21707dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const sp<AaptFile>& file, 21807dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const sp<XMLNode>& parent); 21907dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski 22007dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski 22127f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski sp<AaptFile> flatten(Bundle* bundle, const sp<const ResourceFilter>& filter, 22227f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski const bool isBase); 223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static inline uint32_t makeResId(uint32_t packageId, 225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t typeId, 226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t nameId) 227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return nameId | (typeId<<16) | (packageId<<24); 229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static inline uint32_t getResId(const sp<Package>& p, 232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<Type>& t, 233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t nameId); 234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t getResId(const String16& package, 236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool onlyPublic = true) const; 239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t getResId(const String16& ref, 241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16* defType = NULL, 242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16* defPackage = NULL, 243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char** outErrorMsg = NULL, 244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool onlyPublic = true) const; 245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static bool isValidResourceName(const String16& s); 247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool stringToValue(Res_value* outValue, StringPool* pool, 249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& str, 250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool preserveSpaces, bool coerceType, 251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t attrID, 252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* style = NULL, 253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16* outStr = NULL, void* accessorCookie = NULL, 254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t attrType = ResTable_map::TYPE_ANY, 255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String8* configTypeName = NULL, 256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ConfigDescription* config = NULL); 257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t assignResourceIds(); 2595892248580859620db90d5ef2e3c2f48531933faAdrian Roos status_t addSymbols(const sp<AaptSymbols>& outSymbols = NULL, 2605892248580859620db90d5ef2e3c2f48531933faAdrian Roos bool skipSymbolsWithoutDefaultLocalization = false); 261a01a9374fd386f3a8773528d7a49bc5315492dffAdam Lesinski void addLocalization(const String16& name, const String8& locale, const SourcePos& src); 2625892248580859620db90d5ef2e3c2f48531933faAdrian Roos void addDefaultLocalization(const String16& name); 263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t validateLocalizations(void); 264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 26527f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski status_t flatten(Bundle* bundle, const sp<const ResourceFilter>& filter, 26627f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski const sp<AaptFile>& dest, const bool isBase); 267de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski status_t flattenLibraryTable(const sp<AaptFile>& dest, const Vector<sp<Package> >& libs); 268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void writePublicDefinitions(const String16& package, FILE* fp); 270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual uint32_t getCustomResource(const String16& package, 272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name) const; 274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual uint32_t getCustomResourceWithCreation(const String16& package, 275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const bool createIfNeeded); 278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual uint32_t getRemappedPackage(uint32_t origPackage) const; 279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeType(uint32_t attrID, uint32_t* outType); 280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeMin(uint32_t attrID, uint32_t* outMin); 281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeMax(uint32_t attrID, uint32_t* outMax); 282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeKeys(uint32_t attrID, Vector<String16>* outKeys); 283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeEnum(uint32_t attrID, 284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char16_t* name, size_t nameLen, 285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Res_value* outValue); 286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getAttributeFlags(uint32_t attrID, 287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char16_t* name, size_t nameLen, 288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Res_value* outValue); 289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual uint32_t getAttributeL10N(uint32_t attrID); 290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool getLocalizationSetting(); 292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void reportError(void* accessorCookie, const char* fmt, ...); 293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setCurrentXmlPos(const SourcePos& pos) { mCurrentXmlPos = pos; } 295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Item { 297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Item() : isId(false), format(ResTable_map::TYPE_ANY), bagKeyId(0), evaluating(false) 299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { memset(&parsedValue, 0, sizeof(parsedValue)); } 300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Item(const SourcePos& pos, 301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool _isId, 302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& _value, 303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* _style = NULL, 304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t format = ResTable_map::TYPE_ANY); 305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Item(const Item& o) : sourcePos(o.sourcePos), 306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski isId(o.isId), value(o.value), style(o.style), 307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski format(o.format), bagKeyId(o.bagKeyId), evaluating(false) { 308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski memset(&parsedValue, 0, sizeof(parsedValue)); 309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ~Item() { } 311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Item& operator=(const Item& o) { 313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sourcePos = o.sourcePos; 314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski isId = o.isId; 315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski value = o.value; 316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski style = o.style; 317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski format = o.format; 318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bagKeyId = o.bagKeyId; 319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski parsedValue = o.parsedValue; 320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return *this; 321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos sourcePos; 324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mutable bool isId; 325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 value; 326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<StringPool::entry_style_span> style; 327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t format; 328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t bagKeyId; 329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mutable bool evaluating; 330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Res_value parsedValue; 331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Entry : public RefBase { 334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Entry(const String16& name, const SourcePos& pos) 336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : mName(name), mType(TYPE_UNKNOWN), 337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos) 338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { } 33982a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski 34082a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski Entry(const Entry& entry); 341978ab9d92934b79409638cf220de3002fea8d505Adam Lesinski Entry& operator=(const Entry& entry); 34282a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski 343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~Entry() { } 344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski enum type { 346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TYPE_UNKNOWN = 0, 347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TYPE_ITEM, 348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TYPE_BAG 349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 getName() const { return mName; } 352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski type getType() const { return mType; } 353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setParent(const String16& parent) { mParent = parent; } 355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 getParent() const { return mParent; } 356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t makeItABag(const SourcePos& sourcePos); 358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t emptyBag(const SourcePos& sourcePos); 360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t setItem(const SourcePos& pos, 362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& value, 363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* style = NULL, 364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t format = ResTable_map::TYPE_ANY, 365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const bool overwrite = false); 366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addToBag(const SourcePos& pos, 368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& key, const String16& value, 369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<StringPool::entry_style_span>* style = NULL, 370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool replace=false, bool isId = false, 371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t format = ResTable_map::TYPE_ANY); 372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 37382a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski status_t removeFromBag(const String16& key); 37482a2dd8efe48d3a4e04655f01329da857ace4b7dAdam Lesinski 375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Index of the entry's name string in the key pool. 376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t getNameIndex() const { return mNameIndex; } 377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setNameIndex(int32_t index) { mNameIndex = index; } 378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Item* getItem() const { return mType == TYPE_ITEM ? &mItem : NULL; } 380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const KeyedVector<String16, Item>& getBag() const { return mBag; } 381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t generateAttributes(ResourceTable* table, 383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package); 384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t assignResourceIds(ResourceTable* table, 386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& package); 387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t prepareFlatten(StringPool* strings, ResourceTable* table, 389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String8* configTypeName, const ConfigDescription* config); 390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t remapStringValue(StringPool* strings); 392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ssize_t flatten(Bundle*, const sp<AaptFile>& data, bool isPublic); 394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& getPos() const { return mPos; } 396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private: 398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mName; 399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mParent; 400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski type mType; 401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Item mItem; 402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t mItemFormat; 403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski KeyedVector<String16, Item> mBag; 404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t mNameIndex; 405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t mParentId; 406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos mPos; 407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class ConfigList : public RefBase { 410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ConfigList(const String16& name, const SourcePos& pos) 412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : mName(name), mPos(pos), mPublic(false), mEntryIndex(-1) { } 413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~ConfigList() { } 414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 getName() const { return mName; } 416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& getPos() const { return mPos; } 417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void appendComment(const String16& comment, bool onlyIfEmpty = false); 419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& getComment() const { return mComment; } 420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void appendTypeComment(const String16& comment); 422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& getTypeComment() const { return mTypeComment; } 423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Index of this entry in its Type. 425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t getEntryIndex() const { return mEntryIndex; } 426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setEntryIndex(int32_t index) { mEntryIndex = index; } 427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setPublic(bool pub) { mPublic = pub; } 429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool getPublic() const { return mPublic; } 430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setPublicSourcePos(const SourcePos& pos) { mPublicSourcePos = pos; } 431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& getPublicSourcePos() { return mPublicSourcePos; } 432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void addEntry(const ResTable_config& config, const sp<Entry>& entry) { 434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mEntries.add(config, entry); 435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 437cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski void removeEntry(const ResTable_config& config) { 438cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski mEntries.removeItem(config); 439cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski } 440cf1f1d9128853f0fa0cef657e2bbb7bf6904c732Adam Lesinski 441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; } 442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private: 443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16 mName; 444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos mPos; 445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mComment; 446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mTypeComment; 447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool mPublic; 448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos mPublicSourcePos; 449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t mEntryIndex; 450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<ConfigDescription, sp<Entry> > mEntries; 451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Public { 454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Public() : sourcePos(), ident(0) { } 456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Public(const SourcePos& pos, 457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& _comment, 458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t _ident) 459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : sourcePos(pos), 460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski comment(_comment), ident(_ident) { } 461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Public(const Public& o) : sourcePos(o.sourcePos), 462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski comment(o.comment), ident(o.ident) { } 463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ~Public() { } 464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Public& operator=(const Public& o) { 466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sourcePos = o.sourcePos; 467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski comment = o.comment; 468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ident = o.ident; 469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return *this; 470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos sourcePos; 473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 comment; 474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t ident; 475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Type : public RefBase { 478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Type(const String16& name, const SourcePos& pos) 480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : mName(name), mFirstPublicSourcePos(NULL), mPublicIndex(-1), mIndex(-1), mPos(pos) 481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { } 482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~Type() { delete mFirstPublicSourcePos; } 483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addPublic(const SourcePos& pos, 485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const uint32_t ident); 487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void canAddEntry(const String16& name); 489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 getName() const { return mName; } 491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<Entry> getEntry(const String16& entry, 492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& pos, 493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* config = NULL, 494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool doSetIndex = false, 495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool overlay = false, 496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool autoAddOverlay = false); 497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 4989b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski bool isPublic(const String16& entry) const { 4999b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski return mPublic.indexOfKey(entry) >= 0; 5009b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski } 5019b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski 5029b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski sp<ConfigList> removeEntry(const String16& entry); 5039b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski 5049b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski SortedVector<ConfigDescription> getUniqueConfigs() const; 5059b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski 506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& getFirstPublicSourcePos() const { return *mFirstPublicSourcePos; } 507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t getPublicIndex() const { return mPublicIndex; } 509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t getIndex() const { return mIndex; } 511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void setIndex(int32_t index) { mIndex = index; } 512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t applyPublicEntryOrder(); 514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const DefaultKeyedVector<String16, sp<ConfigList> >& getConfigs() const { return mConfigs; } 516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<sp<ConfigList> >& getOrderedConfigs() const { return mOrderedConfigs; } 517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SortedVector<String16>& getCanAddEntries() const { return mCanAddEntries; } 518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& getPos() const { return mPos; } 5209b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski 521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private: 522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mName; 523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos* mFirstPublicSourcePos; 524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, Public> mPublic; 525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, sp<ConfigList> > mConfigs; 526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<sp<ConfigList> > mOrderedConfigs; 527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SortedVector<String16> mCanAddEntries; 528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t mPublicIndex; 529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int32_t mIndex; 530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos mPos; 531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class Package : public RefBase { 534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 535833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski Package(const String16& name, size_t packageId); 536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~Package() { } 537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 getName() const { return mName; } 539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<Type> getType(const String16& type, 540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& pos, 541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool doSetIndex = false); 542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 543833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski size_t getAssignedId() const { return mPackageId; } 544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResStringPool& getTypeStrings() const { return mTypeStrings; } 546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t indexOfTypeString(const String16& s) const { return mTypeStringsMapping.valueFor(s); } 547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile> getTypeStringsData() const { return mTypeStringsData; } 548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t setTypeStrings(const sp<AaptFile>& data); 549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResStringPool& getKeyStrings() const { return mKeyStrings; } 551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski uint32_t indexOfKeyString(const String16& s) const { return mKeyStringsMapping.valueFor(s); } 552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const sp<AaptFile> getKeyStringsData() const { return mKeyStringsData; } 553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t setKeyStrings(const sp<AaptFile>& data); 554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t applyPublicTypeOrder(); 556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const DefaultKeyedVector<String16, sp<Type> >& getTypes() const { return mTypes; } 558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Vector<sp<Type> >& getOrderedTypes() const { return mOrderedTypes; } 559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 5609b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski void movePrivateAttrs(); 5619b624c186cb6059dfb3ec24bfb6386a0fc17b88cAdam Lesinski 562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private: 563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t setStrings(const sp<AaptFile>& data, 564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResStringPool* strings, 565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, uint32_t>* mappings); 566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16 mName; 568833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski const size_t mPackageId; 569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, sp<Type> > mTypes; 570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<sp<Type> > mOrderedTypes; 571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<AaptFile> mTypeStringsData; 572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<AaptFile> mKeyStringsData; 573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResStringPool mTypeStrings; 574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResStringPool mKeyStrings; 575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, uint32_t> mTypeStringsMapping; 576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, uint32_t> mKeyStringsMapping; 577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 579de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski void getDensityVaryingResources(KeyedVector<Symbol, Vector<SymbolDefinition> >& resources); 580de7de47fef1dcaa26d553665d89e4d3792325c3fAdam Lesinski 581afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski /** 582afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski * Make an attribute with the specified format. If another attribute with the same name but 583afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski * different format exists, this method returns false. If the name is not taken, or if the 584afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski * format is identical, this returns true. 585afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski */ 586afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski bool makeAttribute(const String16& package, 587afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski const String16& name, 588afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski const SourcePos& source, 589afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski int32_t format, 590afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski const String16& comment, 591afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski bool appendComment); 592afc79be228596c56ea68c0d2fa22d0a8d733be47Adam Lesinski 59399d36ee8a936d5f9d95305183241ed597bace8e8Adam Lesinski sp<Package> getPackage(const String16& package); 59499d36ee8a936d5f9d95305183241ed597bace8e8Adam Lesinski 595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void writePublicDefinitions(const String16& package, FILE* fp, bool pub); 597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<Type> getType(const String16& package, 598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& pos, 600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool doSetIndex = false); 601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<Entry> getEntry(const String16& package, 602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& type, 603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const String16& name, 604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SourcePos& pos, 605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool overlay, 606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* config = NULL, 607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool doSetIndex = false); 608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<const Entry> getEntry(uint32_t resID, 609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const ResTable_config* config = NULL) const; 610e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski sp<ConfigList> getConfigList(const String16& package, 611e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& type, 612e572c011feabf6319ba836cf5bc4c3baa0ba6a85Adam Lesinski const String16& name) const; 613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const Item* getItem(uint32_t resID, uint32_t attrID) const; 614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool getItemValue(uint32_t resID, uint32_t attrID, 615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Res_value* outValue); 61628994d8d181c286b39811441ce78399576c2d315Adam Lesinski int getPublicAttributeSdkLevel(uint32_t attrId) const; 617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 61807dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski status_t processBundleFormatImpl(const Bundle* bundle, 61907dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const String16& resourceName, 62007dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const sp<AaptFile>& file, 62107dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski const sp<XMLNode>& parent, 62207dfd2d8642f8a3630ca6429f740865a0c0bfdf7Adam Lesinski Vector<sp<XMLNode> >* namespaces); 623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String16 mAssetsPackage; 625833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski PackageType mPackageType; 626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sp<AaptAssets> mAssets; 627833f3ccbc8f4dd1ec8abb9121988b99ff34ec4c1Adam Lesinski uint32_t mTypeIdOffset; 628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String16, sp<Package> > mPackages; 629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<sp<Package> > mOrderedPackages; 630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t mNumLocal; 631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SourcePos mCurrentXmlPos; 632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bundle* mBundle; 633030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert 634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // key = string resource name, value = set of locales in which that name is defined 635030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert std::map<String16, std::map<String8, SourcePos>> mLocalizations; 6365892248580859620db90d5ef2e3c2f48531933faAdrian Roos // set of string resources names that have a default localization 6375892248580859620db90d5ef2e3c2f48531933faAdrian Roos std::set<String16> mHasDefaultLocalization; 638030f536009b56dbcc23d284541e51562bd9a6ed3Dan Albert std::queue<CompileResourceWorkItem> mWorkQueue; 639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif 642