1*d57664e9SAndroid Build Coastguard Worker //
2*d57664e9SAndroid Build Coastguard Worker // Copyright 2006 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker //
4*d57664e9SAndroid Build Coastguard Worker // Information about assets being operated on.
5*d57664e9SAndroid Build Coastguard Worker //
6*d57664e9SAndroid Build Coastguard Worker #ifndef __AAPT_ASSETS_H
7*d57664e9SAndroid Build Coastguard Worker #define __AAPT_ASSETS_H
8*d57664e9SAndroid Build Coastguard Worker
9*d57664e9SAndroid Build Coastguard Worker #include <androidfw/AssetManager.h>
10*d57664e9SAndroid Build Coastguard Worker #include <androidfw/ResourceTypes.h>
11*d57664e9SAndroid Build Coastguard Worker #include <stdlib.h>
12*d57664e9SAndroid Build Coastguard Worker #include <set>
13*d57664e9SAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
14*d57664e9SAndroid Build Coastguard Worker #include <utils/RefBase.h>
15*d57664e9SAndroid Build Coastguard Worker #include <utils/SortedVector.h>
16*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h>
17*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h>
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Worker #include "AaptConfig.h"
20*d57664e9SAndroid Build Coastguard Worker #include "Bundle.h"
21*d57664e9SAndroid Build Coastguard Worker #include "ConfigDescription.h"
22*d57664e9SAndroid Build Coastguard Worker #include "SourcePos.h"
23*d57664e9SAndroid Build Coastguard Worker #include "ZipFile.h"
24*d57664e9SAndroid Build Coastguard Worker
25*d57664e9SAndroid Build Coastguard Worker using namespace android;
26*d57664e9SAndroid Build Coastguard Worker
27*d57664e9SAndroid Build Coastguard Worker extern const char * const gDefaultIgnoreAssets;
28*d57664e9SAndroid Build Coastguard Worker extern const char * gUserIgnoreAssets;
29*d57664e9SAndroid Build Coastguard Worker
30*d57664e9SAndroid Build Coastguard Worker bool valid_symbol_name(const String8& str);
31*d57664e9SAndroid Build Coastguard Worker
32*d57664e9SAndroid Build Coastguard Worker class AaptAssets;
33*d57664e9SAndroid Build Coastguard Worker
34*d57664e9SAndroid Build Coastguard Worker enum {
35*d57664e9SAndroid Build Coastguard Worker AXIS_NONE = 0,
36*d57664e9SAndroid Build Coastguard Worker AXIS_MCC = 1,
37*d57664e9SAndroid Build Coastguard Worker AXIS_MNC,
38*d57664e9SAndroid Build Coastguard Worker AXIS_LOCALE,
39*d57664e9SAndroid Build Coastguard Worker AXIS_SCREENLAYOUTSIZE,
40*d57664e9SAndroid Build Coastguard Worker AXIS_SCREENLAYOUTLONG,
41*d57664e9SAndroid Build Coastguard Worker AXIS_ORIENTATION,
42*d57664e9SAndroid Build Coastguard Worker AXIS_UIMODETYPE,
43*d57664e9SAndroid Build Coastguard Worker AXIS_UIMODENIGHT,
44*d57664e9SAndroid Build Coastguard Worker AXIS_DENSITY,
45*d57664e9SAndroid Build Coastguard Worker AXIS_TOUCHSCREEN,
46*d57664e9SAndroid Build Coastguard Worker AXIS_KEYSHIDDEN,
47*d57664e9SAndroid Build Coastguard Worker AXIS_KEYBOARD,
48*d57664e9SAndroid Build Coastguard Worker AXIS_NAVHIDDEN,
49*d57664e9SAndroid Build Coastguard Worker AXIS_NAVIGATION,
50*d57664e9SAndroid Build Coastguard Worker AXIS_SCREENSIZE,
51*d57664e9SAndroid Build Coastguard Worker AXIS_SMALLESTSCREENWIDTHDP,
52*d57664e9SAndroid Build Coastguard Worker AXIS_SCREENWIDTHDP,
53*d57664e9SAndroid Build Coastguard Worker AXIS_SCREENHEIGHTDP,
54*d57664e9SAndroid Build Coastguard Worker AXIS_LAYOUTDIR,
55*d57664e9SAndroid Build Coastguard Worker AXIS_VERSION,
56*d57664e9SAndroid Build Coastguard Worker
57*d57664e9SAndroid Build Coastguard Worker AXIS_START = AXIS_MCC,
58*d57664e9SAndroid Build Coastguard Worker AXIS_END = AXIS_VERSION,
59*d57664e9SAndroid Build Coastguard Worker };
60*d57664e9SAndroid Build Coastguard Worker
61*d57664e9SAndroid Build Coastguard Worker struct AaptLocaleValue {
62*d57664e9SAndroid Build Coastguard Worker char language[4];
63*d57664e9SAndroid Build Coastguard Worker char region[4];
64*d57664e9SAndroid Build Coastguard Worker char script[4];
65*d57664e9SAndroid Build Coastguard Worker char variant[8];
66*d57664e9SAndroid Build Coastguard Worker
AaptLocaleValueAaptLocaleValue67*d57664e9SAndroid Build Coastguard Worker AaptLocaleValue() {
68*d57664e9SAndroid Build Coastguard Worker memset(this, 0, sizeof(AaptLocaleValue));
69*d57664e9SAndroid Build Coastguard Worker }
70*d57664e9SAndroid Build Coastguard Worker
71*d57664e9SAndroid Build Coastguard Worker // Initialize this AaptLocaleValue from a config string.
72*d57664e9SAndroid Build Coastguard Worker bool initFromFilterString(const String8& config);
73*d57664e9SAndroid Build Coastguard Worker
74*d57664e9SAndroid Build Coastguard Worker int initFromDirName(const Vector<String8>& parts, const int startIndex);
75*d57664e9SAndroid Build Coastguard Worker
76*d57664e9SAndroid Build Coastguard Worker // Initialize this AaptLocaleValue from a ResTable_config.
77*d57664e9SAndroid Build Coastguard Worker void initFromResTable(const ResTable_config& config);
78*d57664e9SAndroid Build Coastguard Worker
79*d57664e9SAndroid Build Coastguard Worker void writeTo(ResTable_config* out) const;
80*d57664e9SAndroid Build Coastguard Worker
compareAaptLocaleValue81*d57664e9SAndroid Build Coastguard Worker int compare(const AaptLocaleValue& other) const {
82*d57664e9SAndroid Build Coastguard Worker return memcmp(this, &other, sizeof(AaptLocaleValue));
83*d57664e9SAndroid Build Coastguard Worker }
84*d57664e9SAndroid Build Coastguard Worker
85*d57664e9SAndroid Build Coastguard Worker inline bool operator<(const AaptLocaleValue& o) const { return compare(o) < 0; }
86*d57664e9SAndroid Build Coastguard Worker inline bool operator<=(const AaptLocaleValue& o) const { return compare(o) <= 0; }
87*d57664e9SAndroid Build Coastguard Worker inline bool operator==(const AaptLocaleValue& o) const { return compare(o) == 0; }
88*d57664e9SAndroid Build Coastguard Worker inline bool operator!=(const AaptLocaleValue& o) const { return compare(o) != 0; }
89*d57664e9SAndroid Build Coastguard Worker inline bool operator>=(const AaptLocaleValue& o) const { return compare(o) >= 0; }
90*d57664e9SAndroid Build Coastguard Worker inline bool operator>(const AaptLocaleValue& o) const { return compare(o) > 0; }
91*d57664e9SAndroid Build Coastguard Worker private:
92*d57664e9SAndroid Build Coastguard Worker void setLanguage(const char* language);
93*d57664e9SAndroid Build Coastguard Worker void setRegion(const char* language);
94*d57664e9SAndroid Build Coastguard Worker void setScript(const char* script);
95*d57664e9SAndroid Build Coastguard Worker void setVariant(const char* variant);
96*d57664e9SAndroid Build Coastguard Worker };
97*d57664e9SAndroid Build Coastguard Worker
98*d57664e9SAndroid Build Coastguard Worker /**
99*d57664e9SAndroid Build Coastguard Worker * This structure contains a specific variation of a single file out
100*d57664e9SAndroid Build Coastguard Worker * of all the variations it can have that we can have.
101*d57664e9SAndroid Build Coastguard Worker */
102*d57664e9SAndroid Build Coastguard Worker struct AaptGroupEntry
103*d57664e9SAndroid Build Coastguard Worker {
104*d57664e9SAndroid Build Coastguard Worker public:
AaptGroupEntryAaptGroupEntry105*d57664e9SAndroid Build Coastguard Worker AaptGroupEntry() {}
AaptGroupEntryAaptGroupEntry106*d57664e9SAndroid Build Coastguard Worker explicit AaptGroupEntry(const ConfigDescription& config) : mParams(config) {}
107*d57664e9SAndroid Build Coastguard Worker
108*d57664e9SAndroid Build Coastguard Worker bool initFromDirName(const char* dir, String8* resType);
109*d57664e9SAndroid Build Coastguard Worker
toParamsAaptGroupEntry110*d57664e9SAndroid Build Coastguard Worker inline const ConfigDescription& toParams() const { return mParams; }
111*d57664e9SAndroid Build Coastguard Worker
compareAaptGroupEntry112*d57664e9SAndroid Build Coastguard Worker inline int compare(const AaptGroupEntry& o) const { return mParams.compareLogical(o.mParams); }
113*d57664e9SAndroid Build Coastguard Worker inline bool operator<(const AaptGroupEntry& o) const { return compare(o) < 0; }
114*d57664e9SAndroid Build Coastguard Worker inline bool operator<=(const AaptGroupEntry& o) const { return compare(o) <= 0; }
115*d57664e9SAndroid Build Coastguard Worker inline bool operator==(const AaptGroupEntry& o) const { return compare(o) == 0; }
116*d57664e9SAndroid Build Coastguard Worker inline bool operator!=(const AaptGroupEntry& o) const { return compare(o) != 0; }
117*d57664e9SAndroid Build Coastguard Worker inline bool operator>=(const AaptGroupEntry& o) const { return compare(o) >= 0; }
118*d57664e9SAndroid Build Coastguard Worker inline bool operator>(const AaptGroupEntry& o) const { return compare(o) > 0; }
119*d57664e9SAndroid Build Coastguard Worker
toStringAaptGroupEntry120*d57664e9SAndroid Build Coastguard Worker String8 toString() const { return mParams.toString(); }
121*d57664e9SAndroid Build Coastguard Worker String8 toDirName(const String8& resType) const;
122*d57664e9SAndroid Build Coastguard Worker
getVersionStringAaptGroupEntry123*d57664e9SAndroid Build Coastguard Worker const String8 getVersionString() const { return AaptConfig::getVersion(mParams); }
124*d57664e9SAndroid Build Coastguard Worker
125*d57664e9SAndroid Build Coastguard Worker private:
126*d57664e9SAndroid Build Coastguard Worker ConfigDescription mParams;
127*d57664e9SAndroid Build Coastguard Worker };
128*d57664e9SAndroid Build Coastguard Worker
compare_type(const AaptGroupEntry & lhs,const AaptGroupEntry & rhs)129*d57664e9SAndroid Build Coastguard Worker inline int compare_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs)
130*d57664e9SAndroid Build Coastguard Worker {
131*d57664e9SAndroid Build Coastguard Worker return lhs.compare(rhs);
132*d57664e9SAndroid Build Coastguard Worker }
133*d57664e9SAndroid Build Coastguard Worker
strictly_order_type(const AaptGroupEntry & lhs,const AaptGroupEntry & rhs)134*d57664e9SAndroid Build Coastguard Worker inline int strictly_order_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs)
135*d57664e9SAndroid Build Coastguard Worker {
136*d57664e9SAndroid Build Coastguard Worker return compare_type(lhs, rhs) < 0;
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker
139*d57664e9SAndroid Build Coastguard Worker class AaptGroup;
140*d57664e9SAndroid Build Coastguard Worker class FilePathStore;
141*d57664e9SAndroid Build Coastguard Worker
142*d57664e9SAndroid Build Coastguard Worker /**
143*d57664e9SAndroid Build Coastguard Worker * A single asset file we know about.
144*d57664e9SAndroid Build Coastguard Worker */
145*d57664e9SAndroid Build Coastguard Worker class AaptFile : public RefBase
146*d57664e9SAndroid Build Coastguard Worker {
147*d57664e9SAndroid Build Coastguard Worker public:
AaptFile(const String8 & sourceFile,const AaptGroupEntry & groupEntry,const String8 & resType)148*d57664e9SAndroid Build Coastguard Worker AaptFile(const String8& sourceFile, const AaptGroupEntry& groupEntry,
149*d57664e9SAndroid Build Coastguard Worker const String8& resType)
150*d57664e9SAndroid Build Coastguard Worker : mGroupEntry(groupEntry)
151*d57664e9SAndroid Build Coastguard Worker , mResourceType(resType)
152*d57664e9SAndroid Build Coastguard Worker , mSourceFile(sourceFile)
153*d57664e9SAndroid Build Coastguard Worker , mData(NULL)
154*d57664e9SAndroid Build Coastguard Worker , mDataSize(0)
155*d57664e9SAndroid Build Coastguard Worker , mBufferSize(0)
156*d57664e9SAndroid Build Coastguard Worker , mCompression(ZipEntry::kCompressStored)
157*d57664e9SAndroid Build Coastguard Worker {
158*d57664e9SAndroid Build Coastguard Worker //printf("new AaptFile created %s\n", (const char*)sourceFile);
159*d57664e9SAndroid Build Coastguard Worker }
~AaptFile()160*d57664e9SAndroid Build Coastguard Worker virtual ~AaptFile() {
161*d57664e9SAndroid Build Coastguard Worker free(mData);
162*d57664e9SAndroid Build Coastguard Worker }
163*d57664e9SAndroid Build Coastguard Worker
getPath()164*d57664e9SAndroid Build Coastguard Worker const String8& getPath() const { return mPath; }
getGroupEntry()165*d57664e9SAndroid Build Coastguard Worker const AaptGroupEntry& getGroupEntry() const { return mGroupEntry; }
166*d57664e9SAndroid Build Coastguard Worker
167*d57664e9SAndroid Build Coastguard Worker // Data API. If there is data attached to the file,
168*d57664e9SAndroid Build Coastguard Worker // getSourceFile() is not used.
hasData()169*d57664e9SAndroid Build Coastguard Worker bool hasData() const { return mData != NULL; }
getData()170*d57664e9SAndroid Build Coastguard Worker const void* getData() const { return mData; }
getSize()171*d57664e9SAndroid Build Coastguard Worker size_t getSize() const { return mDataSize; }
172*d57664e9SAndroid Build Coastguard Worker void* editData(size_t size);
173*d57664e9SAndroid Build Coastguard Worker void* editData(size_t* outSize = NULL);
174*d57664e9SAndroid Build Coastguard Worker void* editDataInRange(size_t offset, size_t size);
175*d57664e9SAndroid Build Coastguard Worker void* padData(size_t wordSize);
176*d57664e9SAndroid Build Coastguard Worker status_t writeData(const void* data, size_t size);
177*d57664e9SAndroid Build Coastguard Worker void clearData();
178*d57664e9SAndroid Build Coastguard Worker
getResourceType()179*d57664e9SAndroid Build Coastguard Worker const String8& getResourceType() const { return mResourceType; }
180*d57664e9SAndroid Build Coastguard Worker
181*d57664e9SAndroid Build Coastguard Worker // File API. If the file does not hold raw data, this is
182*d57664e9SAndroid Build Coastguard Worker // a full path to a file on the filesystem that holds its data.
getSourceFile()183*d57664e9SAndroid Build Coastguard Worker const String8& getSourceFile() const { return mSourceFile; }
184*d57664e9SAndroid Build Coastguard Worker
185*d57664e9SAndroid Build Coastguard Worker String8 getPrintableSource() const;
186*d57664e9SAndroid Build Coastguard Worker
187*d57664e9SAndroid Build Coastguard Worker // Desired compression method, as per utils/ZipEntry.h. For example,
188*d57664e9SAndroid Build Coastguard Worker // no compression is ZipEntry::kCompressStored.
getCompressionMethod()189*d57664e9SAndroid Build Coastguard Worker int getCompressionMethod() const { return mCompression; }
setCompressionMethod(int c)190*d57664e9SAndroid Build Coastguard Worker void setCompressionMethod(int c) { mCompression = c; }
191*d57664e9SAndroid Build Coastguard Worker private:
192*d57664e9SAndroid Build Coastguard Worker friend class AaptGroup;
193*d57664e9SAndroid Build Coastguard Worker
194*d57664e9SAndroid Build Coastguard Worker String8 mPath;
195*d57664e9SAndroid Build Coastguard Worker AaptGroupEntry mGroupEntry;
196*d57664e9SAndroid Build Coastguard Worker String8 mResourceType;
197*d57664e9SAndroid Build Coastguard Worker String8 mSourceFile;
198*d57664e9SAndroid Build Coastguard Worker void* mData;
199*d57664e9SAndroid Build Coastguard Worker size_t mDataSize;
200*d57664e9SAndroid Build Coastguard Worker size_t mBufferSize;
201*d57664e9SAndroid Build Coastguard Worker int mCompression;
202*d57664e9SAndroid Build Coastguard Worker };
203*d57664e9SAndroid Build Coastguard Worker
204*d57664e9SAndroid Build Coastguard Worker /**
205*d57664e9SAndroid Build Coastguard Worker * A group of related files (the same file, with different
206*d57664e9SAndroid Build Coastguard Worker * vendor/locale variations).
207*d57664e9SAndroid Build Coastguard Worker */
208*d57664e9SAndroid Build Coastguard Worker class AaptGroup : public RefBase
209*d57664e9SAndroid Build Coastguard Worker {
210*d57664e9SAndroid Build Coastguard Worker public:
AaptGroup(const String8 & leaf,const String8 & path)211*d57664e9SAndroid Build Coastguard Worker AaptGroup(const String8& leaf, const String8& path)
212*d57664e9SAndroid Build Coastguard Worker : mLeaf(leaf), mPath(path) { }
~AaptGroup()213*d57664e9SAndroid Build Coastguard Worker virtual ~AaptGroup() { }
214*d57664e9SAndroid Build Coastguard Worker
getLeaf()215*d57664e9SAndroid Build Coastguard Worker const String8& getLeaf() const { return mLeaf; }
216*d57664e9SAndroid Build Coastguard Worker
217*d57664e9SAndroid Build Coastguard Worker // Returns the relative path after the AaptGroupEntry dirs.
getPath()218*d57664e9SAndroid Build Coastguard Worker const String8& getPath() const { return mPath; }
219*d57664e9SAndroid Build Coastguard Worker
getFiles()220*d57664e9SAndroid Build Coastguard Worker const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& getFiles() const
221*d57664e9SAndroid Build Coastguard Worker { return mFiles; }
222*d57664e9SAndroid Build Coastguard Worker
223*d57664e9SAndroid Build Coastguard Worker status_t addFile(const sp<AaptFile>& file, const bool overwriteDuplicate=false);
224*d57664e9SAndroid Build Coastguard Worker void removeFile(size_t index);
225*d57664e9SAndroid Build Coastguard Worker
226*d57664e9SAndroid Build Coastguard Worker void print(const String8& prefix) const;
227*d57664e9SAndroid Build Coastguard Worker
228*d57664e9SAndroid Build Coastguard Worker String8 getPrintableSource() const;
229*d57664e9SAndroid Build Coastguard Worker
230*d57664e9SAndroid Build Coastguard Worker private:
231*d57664e9SAndroid Build Coastguard Worker String8 mLeaf;
232*d57664e9SAndroid Build Coastguard Worker String8 mPath;
233*d57664e9SAndroid Build Coastguard Worker
234*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > mFiles;
235*d57664e9SAndroid Build Coastguard Worker };
236*d57664e9SAndroid Build Coastguard Worker
237*d57664e9SAndroid Build Coastguard Worker /**
238*d57664e9SAndroid Build Coastguard Worker * A single directory of assets, which can contain files and other
239*d57664e9SAndroid Build Coastguard Worker * sub-directories.
240*d57664e9SAndroid Build Coastguard Worker */
241*d57664e9SAndroid Build Coastguard Worker class AaptDir : public RefBase
242*d57664e9SAndroid Build Coastguard Worker {
243*d57664e9SAndroid Build Coastguard Worker public:
AaptDir(const String8 & leaf,const String8 & path)244*d57664e9SAndroid Build Coastguard Worker AaptDir(const String8& leaf, const String8& path)
245*d57664e9SAndroid Build Coastguard Worker : mLeaf(leaf), mPath(path) { }
~AaptDir()246*d57664e9SAndroid Build Coastguard Worker virtual ~AaptDir() { }
247*d57664e9SAndroid Build Coastguard Worker
getLeaf()248*d57664e9SAndroid Build Coastguard Worker const String8& getLeaf() const { return mLeaf; }
249*d57664e9SAndroid Build Coastguard Worker
getPath()250*d57664e9SAndroid Build Coastguard Worker const String8& getPath() const { return mPath; }
251*d57664e9SAndroid Build Coastguard Worker
getFiles()252*d57664e9SAndroid Build Coastguard Worker const DefaultKeyedVector<String8, sp<AaptGroup> >& getFiles() const { return mFiles; }
getDirs()253*d57664e9SAndroid Build Coastguard Worker const DefaultKeyedVector<String8, sp<AaptDir> >& getDirs() const { return mDirs; }
254*d57664e9SAndroid Build Coastguard Worker
255*d57664e9SAndroid Build Coastguard Worker virtual status_t addFile(const String8& name, const sp<AaptGroup>& file);
256*d57664e9SAndroid Build Coastguard Worker
257*d57664e9SAndroid Build Coastguard Worker void removeFile(const String8& name);
258*d57664e9SAndroid Build Coastguard Worker void removeDir(const String8& name);
259*d57664e9SAndroid Build Coastguard Worker
260*d57664e9SAndroid Build Coastguard Worker /*
261*d57664e9SAndroid Build Coastguard Worker * Perform some sanity checks on the names of files and directories here.
262*d57664e9SAndroid Build Coastguard Worker * In particular:
263*d57664e9SAndroid Build Coastguard Worker * - Check for illegal chars in filenames.
264*d57664e9SAndroid Build Coastguard Worker * - Check filename length.
265*d57664e9SAndroid Build Coastguard Worker * - Check for presence of ".gz" and non-".gz" copies of same file.
266*d57664e9SAndroid Build Coastguard Worker * - Check for multiple files whose names match in a case-insensitive
267*d57664e9SAndroid Build Coastguard Worker * fashion (problematic for some systems).
268*d57664e9SAndroid Build Coastguard Worker *
269*d57664e9SAndroid Build Coastguard Worker * Comparing names against all other names is O(n^2). We could speed
270*d57664e9SAndroid Build Coastguard Worker * it up some by sorting the entries and being smarter about what we
271*d57664e9SAndroid Build Coastguard Worker * compare against, but I'm not expecting to have enough files in a
272*d57664e9SAndroid Build Coastguard Worker * single directory to make a noticeable difference in speed.
273*d57664e9SAndroid Build Coastguard Worker *
274*d57664e9SAndroid Build Coastguard Worker * Note that sorting here is not enough to guarantee that the package
275*d57664e9SAndroid Build Coastguard Worker * contents are sorted -- subsequent updates can rearrange things.
276*d57664e9SAndroid Build Coastguard Worker */
277*d57664e9SAndroid Build Coastguard Worker status_t validate() const;
278*d57664e9SAndroid Build Coastguard Worker
279*d57664e9SAndroid Build Coastguard Worker void print(const String8& prefix) const;
280*d57664e9SAndroid Build Coastguard Worker
281*d57664e9SAndroid Build Coastguard Worker String8 getPrintableSource() const;
282*d57664e9SAndroid Build Coastguard Worker
283*d57664e9SAndroid Build Coastguard Worker private:
284*d57664e9SAndroid Build Coastguard Worker friend class AaptAssets;
285*d57664e9SAndroid Build Coastguard Worker
286*d57664e9SAndroid Build Coastguard Worker status_t addDir(const String8& name, const sp<AaptDir>& dir);
287*d57664e9SAndroid Build Coastguard Worker sp<AaptDir> makeDir(const String8& name);
288*d57664e9SAndroid Build Coastguard Worker status_t addLeafFile(const String8& leafName,
289*d57664e9SAndroid Build Coastguard Worker const sp<AaptFile>& file,
290*d57664e9SAndroid Build Coastguard Worker const bool overwrite=false);
291*d57664e9SAndroid Build Coastguard Worker virtual ssize_t slurpFullTree(Bundle* bundle,
292*d57664e9SAndroid Build Coastguard Worker const String8& srcDir,
293*d57664e9SAndroid Build Coastguard Worker const AaptGroupEntry& kind,
294*d57664e9SAndroid Build Coastguard Worker const String8& resType,
295*d57664e9SAndroid Build Coastguard Worker sp<FilePathStore>& fullResPaths,
296*d57664e9SAndroid Build Coastguard Worker const bool overwrite=false);
297*d57664e9SAndroid Build Coastguard Worker
298*d57664e9SAndroid Build Coastguard Worker String8 mLeaf;
299*d57664e9SAndroid Build Coastguard Worker String8 mPath;
300*d57664e9SAndroid Build Coastguard Worker
301*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<String8, sp<AaptGroup> > mFiles;
302*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<String8, sp<AaptDir> > mDirs;
303*d57664e9SAndroid Build Coastguard Worker };
304*d57664e9SAndroid Build Coastguard Worker
305*d57664e9SAndroid Build Coastguard Worker /**
306*d57664e9SAndroid Build Coastguard Worker * All information we know about a particular symbol.
307*d57664e9SAndroid Build Coastguard Worker */
308*d57664e9SAndroid Build Coastguard Worker class AaptSymbolEntry
309*d57664e9SAndroid Build Coastguard Worker {
310*d57664e9SAndroid Build Coastguard Worker public:
AaptSymbolEntry()311*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry()
312*d57664e9SAndroid Build Coastguard Worker : isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
313*d57664e9SAndroid Build Coastguard Worker {
314*d57664e9SAndroid Build Coastguard Worker }
AaptSymbolEntry(const String8 & _name)315*d57664e9SAndroid Build Coastguard Worker explicit AaptSymbolEntry(const String8& _name)
316*d57664e9SAndroid Build Coastguard Worker : name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
317*d57664e9SAndroid Build Coastguard Worker {
318*d57664e9SAndroid Build Coastguard Worker }
AaptSymbolEntry(const AaptSymbolEntry & o)319*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry(const AaptSymbolEntry& o)
320*d57664e9SAndroid Build Coastguard Worker : name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic)
321*d57664e9SAndroid Build Coastguard Worker , isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment)
322*d57664e9SAndroid Build Coastguard Worker , typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal)
323*d57664e9SAndroid Build Coastguard Worker {
324*d57664e9SAndroid Build Coastguard Worker }
325*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry operator=(const AaptSymbolEntry& o)
326*d57664e9SAndroid Build Coastguard Worker {
327*d57664e9SAndroid Build Coastguard Worker sourcePos = o.sourcePos;
328*d57664e9SAndroid Build Coastguard Worker isPublic = o.isPublic;
329*d57664e9SAndroid Build Coastguard Worker isJavaSymbol = o.isJavaSymbol;
330*d57664e9SAndroid Build Coastguard Worker comment = o.comment;
331*d57664e9SAndroid Build Coastguard Worker typeComment = o.typeComment;
332*d57664e9SAndroid Build Coastguard Worker typeCode = o.typeCode;
333*d57664e9SAndroid Build Coastguard Worker int32Val = o.int32Val;
334*d57664e9SAndroid Build Coastguard Worker stringVal = o.stringVal;
335*d57664e9SAndroid Build Coastguard Worker return *this;
336*d57664e9SAndroid Build Coastguard Worker }
337*d57664e9SAndroid Build Coastguard Worker
338*d57664e9SAndroid Build Coastguard Worker const String8 name;
339*d57664e9SAndroid Build Coastguard Worker
340*d57664e9SAndroid Build Coastguard Worker SourcePos sourcePos;
341*d57664e9SAndroid Build Coastguard Worker bool isPublic;
342*d57664e9SAndroid Build Coastguard Worker bool isJavaSymbol;
343*d57664e9SAndroid Build Coastguard Worker
344*d57664e9SAndroid Build Coastguard Worker String16 comment;
345*d57664e9SAndroid Build Coastguard Worker String16 typeComment;
346*d57664e9SAndroid Build Coastguard Worker
347*d57664e9SAndroid Build Coastguard Worker enum {
348*d57664e9SAndroid Build Coastguard Worker TYPE_UNKNOWN = 0,
349*d57664e9SAndroid Build Coastguard Worker TYPE_INT32,
350*d57664e9SAndroid Build Coastguard Worker TYPE_STRING
351*d57664e9SAndroid Build Coastguard Worker };
352*d57664e9SAndroid Build Coastguard Worker
353*d57664e9SAndroid Build Coastguard Worker int typeCode;
354*d57664e9SAndroid Build Coastguard Worker
355*d57664e9SAndroid Build Coastguard Worker // Value. May be one of these.
356*d57664e9SAndroid Build Coastguard Worker int32_t int32Val;
357*d57664e9SAndroid Build Coastguard Worker String8 stringVal;
358*d57664e9SAndroid Build Coastguard Worker };
359*d57664e9SAndroid Build Coastguard Worker
360*d57664e9SAndroid Build Coastguard Worker /**
361*d57664e9SAndroid Build Coastguard Worker * A group of related symbols (such as indices into a string block)
362*d57664e9SAndroid Build Coastguard Worker * that have been generated from the assets.
363*d57664e9SAndroid Build Coastguard Worker */
364*d57664e9SAndroid Build Coastguard Worker class AaptSymbols : public RefBase
365*d57664e9SAndroid Build Coastguard Worker {
366*d57664e9SAndroid Build Coastguard Worker public:
AaptSymbols()367*d57664e9SAndroid Build Coastguard Worker AaptSymbols() { }
~AaptSymbols()368*d57664e9SAndroid Build Coastguard Worker virtual ~AaptSymbols() { }
369*d57664e9SAndroid Build Coastguard Worker
addSymbol(const String8 & name,int32_t value,const SourcePos & pos)370*d57664e9SAndroid Build Coastguard Worker status_t addSymbol(const String8& name, int32_t value, const SourcePos& pos) {
371*d57664e9SAndroid Build Coastguard Worker if (!check_valid_symbol_name(name, pos, "symbol")) {
372*d57664e9SAndroid Build Coastguard Worker return BAD_VALUE;
373*d57664e9SAndroid Build Coastguard Worker }
374*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, &pos);
375*d57664e9SAndroid Build Coastguard Worker sym.typeCode = AaptSymbolEntry::TYPE_INT32;
376*d57664e9SAndroid Build Coastguard Worker sym.int32Val = value;
377*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
378*d57664e9SAndroid Build Coastguard Worker }
379*d57664e9SAndroid Build Coastguard Worker
addStringSymbol(const String8 & name,const String8 & value,const SourcePos & pos)380*d57664e9SAndroid Build Coastguard Worker status_t addStringSymbol(const String8& name, const String8& value,
381*d57664e9SAndroid Build Coastguard Worker const SourcePos& pos) {
382*d57664e9SAndroid Build Coastguard Worker if (!check_valid_symbol_name(name, pos, "symbol")) {
383*d57664e9SAndroid Build Coastguard Worker return BAD_VALUE;
384*d57664e9SAndroid Build Coastguard Worker }
385*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, &pos);
386*d57664e9SAndroid Build Coastguard Worker sym.typeCode = AaptSymbolEntry::TYPE_STRING;
387*d57664e9SAndroid Build Coastguard Worker sym.stringVal = value;
388*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
389*d57664e9SAndroid Build Coastguard Worker }
390*d57664e9SAndroid Build Coastguard Worker
makeSymbolPublic(const String8 & name,const SourcePos & pos)391*d57664e9SAndroid Build Coastguard Worker status_t makeSymbolPublic(const String8& name, const SourcePos& pos) {
392*d57664e9SAndroid Build Coastguard Worker if (!check_valid_symbol_name(name, pos, "symbol")) {
393*d57664e9SAndroid Build Coastguard Worker return BAD_VALUE;
394*d57664e9SAndroid Build Coastguard Worker }
395*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, &pos);
396*d57664e9SAndroid Build Coastguard Worker sym.isPublic = true;
397*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
398*d57664e9SAndroid Build Coastguard Worker }
399*d57664e9SAndroid Build Coastguard Worker
makeSymbolJavaSymbol(const String8 & name,const SourcePos & pos)400*d57664e9SAndroid Build Coastguard Worker status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) {
401*d57664e9SAndroid Build Coastguard Worker if (!check_valid_symbol_name(name, pos, "symbol")) {
402*d57664e9SAndroid Build Coastguard Worker return BAD_VALUE;
403*d57664e9SAndroid Build Coastguard Worker }
404*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, &pos);
405*d57664e9SAndroid Build Coastguard Worker sym.isJavaSymbol = true;
406*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
407*d57664e9SAndroid Build Coastguard Worker }
408*d57664e9SAndroid Build Coastguard Worker
appendComment(const String8 & name,const String16 & comment,const SourcePos & pos)409*d57664e9SAndroid Build Coastguard Worker void appendComment(const String8& name, const String16& comment, const SourcePos& pos) {
410*d57664e9SAndroid Build Coastguard Worker if (comment.size() <= 0) {
411*d57664e9SAndroid Build Coastguard Worker return;
412*d57664e9SAndroid Build Coastguard Worker }
413*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, &pos);
414*d57664e9SAndroid Build Coastguard Worker if (sym.comment.size() == 0) {
415*d57664e9SAndroid Build Coastguard Worker sym.comment = comment;
416*d57664e9SAndroid Build Coastguard Worker } else {
417*d57664e9SAndroid Build Coastguard Worker sym.comment.append(String16("\n"));
418*d57664e9SAndroid Build Coastguard Worker sym.comment.append(comment);
419*d57664e9SAndroid Build Coastguard Worker }
420*d57664e9SAndroid Build Coastguard Worker }
421*d57664e9SAndroid Build Coastguard Worker
appendTypeComment(const String8 & name,const String16 & comment)422*d57664e9SAndroid Build Coastguard Worker void appendTypeComment(const String8& name, const String16& comment) {
423*d57664e9SAndroid Build Coastguard Worker if (comment.size() <= 0) {
424*d57664e9SAndroid Build Coastguard Worker return;
425*d57664e9SAndroid Build Coastguard Worker }
426*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = edit_symbol(name, NULL);
427*d57664e9SAndroid Build Coastguard Worker if (sym.typeComment.size() == 0) {
428*d57664e9SAndroid Build Coastguard Worker sym.typeComment = comment;
429*d57664e9SAndroid Build Coastguard Worker } else {
430*d57664e9SAndroid Build Coastguard Worker sym.typeComment.append(String16("\n"));
431*d57664e9SAndroid Build Coastguard Worker sym.typeComment.append(comment);
432*d57664e9SAndroid Build Coastguard Worker }
433*d57664e9SAndroid Build Coastguard Worker }
434*d57664e9SAndroid Build Coastguard Worker
addNestedSymbol(const String8 & name,const SourcePos & pos)435*d57664e9SAndroid Build Coastguard Worker sp<AaptSymbols> addNestedSymbol(const String8& name, const SourcePos& pos) {
436*d57664e9SAndroid Build Coastguard Worker if (!check_valid_symbol_name(name, pos, "nested symbol")) {
437*d57664e9SAndroid Build Coastguard Worker return NULL;
438*d57664e9SAndroid Build Coastguard Worker }
439*d57664e9SAndroid Build Coastguard Worker
440*d57664e9SAndroid Build Coastguard Worker sp<AaptSymbols> sym = mNestedSymbols.valueFor(name);
441*d57664e9SAndroid Build Coastguard Worker if (sym == NULL) {
442*d57664e9SAndroid Build Coastguard Worker sym = new AaptSymbols();
443*d57664e9SAndroid Build Coastguard Worker mNestedSymbols.add(name, sym);
444*d57664e9SAndroid Build Coastguard Worker }
445*d57664e9SAndroid Build Coastguard Worker
446*d57664e9SAndroid Build Coastguard Worker return sym;
447*d57664e9SAndroid Build Coastguard Worker }
448*d57664e9SAndroid Build Coastguard Worker
449*d57664e9SAndroid Build Coastguard Worker status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols);
450*d57664e9SAndroid Build Coastguard Worker
getSymbols()451*d57664e9SAndroid Build Coastguard Worker const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const
452*d57664e9SAndroid Build Coastguard Worker { return mSymbols; }
getNestedSymbols()453*d57664e9SAndroid Build Coastguard Worker const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const
454*d57664e9SAndroid Build Coastguard Worker { return mNestedSymbols; }
455*d57664e9SAndroid Build Coastguard Worker
getComment(const String8 & name)456*d57664e9SAndroid Build Coastguard Worker const String16& getComment(const String8& name) const
457*d57664e9SAndroid Build Coastguard Worker { return get_symbol(name).comment; }
getTypeComment(const String8 & name)458*d57664e9SAndroid Build Coastguard Worker const String16& getTypeComment(const String8& name) const
459*d57664e9SAndroid Build Coastguard Worker { return get_symbol(name).typeComment; }
460*d57664e9SAndroid Build Coastguard Worker
461*d57664e9SAndroid Build Coastguard Worker private:
check_valid_symbol_name(const String8 & symbol,const SourcePos & pos,const char * label)462*d57664e9SAndroid Build Coastguard Worker bool check_valid_symbol_name(const String8& symbol, const SourcePos& pos, const char* label) {
463*d57664e9SAndroid Build Coastguard Worker if (valid_symbol_name(symbol)) {
464*d57664e9SAndroid Build Coastguard Worker return true;
465*d57664e9SAndroid Build Coastguard Worker }
466*d57664e9SAndroid Build Coastguard Worker pos.error("invalid %s: '%s'\n", label, symbol.c_str());
467*d57664e9SAndroid Build Coastguard Worker return false;
468*d57664e9SAndroid Build Coastguard Worker }
edit_symbol(const String8 & symbol,const SourcePos * pos)469*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& edit_symbol(const String8& symbol, const SourcePos* pos) {
470*d57664e9SAndroid Build Coastguard Worker ssize_t i = mSymbols.indexOfKey(symbol);
471*d57664e9SAndroid Build Coastguard Worker if (i < 0) {
472*d57664e9SAndroid Build Coastguard Worker i = mSymbols.add(symbol, AaptSymbolEntry(symbol));
473*d57664e9SAndroid Build Coastguard Worker }
474*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry& sym = mSymbols.editValueAt(i);
475*d57664e9SAndroid Build Coastguard Worker if (pos != NULL && sym.sourcePos.line < 0) {
476*d57664e9SAndroid Build Coastguard Worker sym.sourcePos = *pos;
477*d57664e9SAndroid Build Coastguard Worker }
478*d57664e9SAndroid Build Coastguard Worker return sym;
479*d57664e9SAndroid Build Coastguard Worker }
get_symbol(const String8 & symbol)480*d57664e9SAndroid Build Coastguard Worker const AaptSymbolEntry& get_symbol(const String8& symbol) const {
481*d57664e9SAndroid Build Coastguard Worker ssize_t i = mSymbols.indexOfKey(symbol);
482*d57664e9SAndroid Build Coastguard Worker if (i >= 0) {
483*d57664e9SAndroid Build Coastguard Worker return mSymbols.valueAt(i);
484*d57664e9SAndroid Build Coastguard Worker }
485*d57664e9SAndroid Build Coastguard Worker return mDefSymbol;
486*d57664e9SAndroid Build Coastguard Worker }
487*d57664e9SAndroid Build Coastguard Worker
488*d57664e9SAndroid Build Coastguard Worker KeyedVector<String8, AaptSymbolEntry> mSymbols;
489*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<String8, sp<AaptSymbols> > mNestedSymbols;
490*d57664e9SAndroid Build Coastguard Worker AaptSymbolEntry mDefSymbol;
491*d57664e9SAndroid Build Coastguard Worker };
492*d57664e9SAndroid Build Coastguard Worker
493*d57664e9SAndroid Build Coastguard Worker class ResourceTypeSet : public RefBase,
494*d57664e9SAndroid Build Coastguard Worker public KeyedVector<String8,sp<AaptGroup> >
495*d57664e9SAndroid Build Coastguard Worker {
496*d57664e9SAndroid Build Coastguard Worker public:
497*d57664e9SAndroid Build Coastguard Worker ResourceTypeSet();
498*d57664e9SAndroid Build Coastguard Worker };
499*d57664e9SAndroid Build Coastguard Worker
500*d57664e9SAndroid Build Coastguard Worker // Storage for lists of fully qualified paths for
501*d57664e9SAndroid Build Coastguard Worker // resources encountered during slurping.
502*d57664e9SAndroid Build Coastguard Worker class FilePathStore : public RefBase,
503*d57664e9SAndroid Build Coastguard Worker public Vector<String8>
504*d57664e9SAndroid Build Coastguard Worker {
505*d57664e9SAndroid Build Coastguard Worker public:
506*d57664e9SAndroid Build Coastguard Worker FilePathStore();
507*d57664e9SAndroid Build Coastguard Worker };
508*d57664e9SAndroid Build Coastguard Worker
509*d57664e9SAndroid Build Coastguard Worker /**
510*d57664e9SAndroid Build Coastguard Worker * Asset hierarchy being operated on.
511*d57664e9SAndroid Build Coastguard Worker */
512*d57664e9SAndroid Build Coastguard Worker class AaptAssets : public AaptDir
513*d57664e9SAndroid Build Coastguard Worker {
514*d57664e9SAndroid Build Coastguard Worker public:
515*d57664e9SAndroid Build Coastguard Worker AaptAssets();
~AaptAssets()516*d57664e9SAndroid Build Coastguard Worker virtual ~AaptAssets() { delete mRes; }
517*d57664e9SAndroid Build Coastguard Worker
getPackage()518*d57664e9SAndroid Build Coastguard Worker const String8& getPackage() const { return mPackage; }
setPackage(const String8 & package)519*d57664e9SAndroid Build Coastguard Worker void setPackage(const String8& package) {
520*d57664e9SAndroid Build Coastguard Worker mPackage = package;
521*d57664e9SAndroid Build Coastguard Worker mSymbolsPrivatePackage = package;
522*d57664e9SAndroid Build Coastguard Worker mHavePrivateSymbols = false;
523*d57664e9SAndroid Build Coastguard Worker }
524*d57664e9SAndroid Build Coastguard Worker
525*d57664e9SAndroid Build Coastguard Worker const SortedVector<AaptGroupEntry>& getGroupEntries() const;
526*d57664e9SAndroid Build Coastguard Worker
527*d57664e9SAndroid Build Coastguard Worker virtual status_t addFile(const String8& name, const sp<AaptGroup>& file);
528*d57664e9SAndroid Build Coastguard Worker
529*d57664e9SAndroid Build Coastguard Worker sp<AaptFile> addFile(const String8& filePath,
530*d57664e9SAndroid Build Coastguard Worker const AaptGroupEntry& entry,
531*d57664e9SAndroid Build Coastguard Worker const String8& srcDir,
532*d57664e9SAndroid Build Coastguard Worker sp<AaptGroup>* outGroup,
533*d57664e9SAndroid Build Coastguard Worker const String8& resType);
534*d57664e9SAndroid Build Coastguard Worker
535*d57664e9SAndroid Build Coastguard Worker void addResource(const String8& leafName,
536*d57664e9SAndroid Build Coastguard Worker const String8& path,
537*d57664e9SAndroid Build Coastguard Worker const sp<AaptFile>& file,
538*d57664e9SAndroid Build Coastguard Worker const String8& resType);
539*d57664e9SAndroid Build Coastguard Worker
addGroupEntry(const AaptGroupEntry & entry)540*d57664e9SAndroid Build Coastguard Worker void addGroupEntry(const AaptGroupEntry& entry) { mGroupEntries.add(entry); }
541*d57664e9SAndroid Build Coastguard Worker
542*d57664e9SAndroid Build Coastguard Worker ssize_t slurpFromArgs(Bundle* bundle);
543*d57664e9SAndroid Build Coastguard Worker
544*d57664e9SAndroid Build Coastguard Worker sp<AaptSymbols> getSymbolsFor(const String8& name);
545*d57664e9SAndroid Build Coastguard Worker
546*d57664e9SAndroid Build Coastguard Worker sp<AaptSymbols> getJavaSymbolsFor(const String8& name);
547*d57664e9SAndroid Build Coastguard Worker
548*d57664e9SAndroid Build Coastguard Worker status_t applyJavaSymbols();
549*d57664e9SAndroid Build Coastguard Worker
getSymbols()550*d57664e9SAndroid Build Coastguard Worker const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; }
551*d57664e9SAndroid Build Coastguard Worker
getSymbolsPrivatePackage()552*d57664e9SAndroid Build Coastguard Worker String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; }
setSymbolsPrivatePackage(const String8 & pkg)553*d57664e9SAndroid Build Coastguard Worker void setSymbolsPrivatePackage(const String8& pkg) {
554*d57664e9SAndroid Build Coastguard Worker mSymbolsPrivatePackage = pkg;
555*d57664e9SAndroid Build Coastguard Worker mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage;
556*d57664e9SAndroid Build Coastguard Worker }
557*d57664e9SAndroid Build Coastguard Worker
havePrivateSymbols()558*d57664e9SAndroid Build Coastguard Worker bool havePrivateSymbols() const { return mHavePrivateSymbols; }
559*d57664e9SAndroid Build Coastguard Worker
560*d57664e9SAndroid Build Coastguard Worker bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const;
561*d57664e9SAndroid Build Coastguard Worker
562*d57664e9SAndroid Build Coastguard Worker status_t buildIncludedResources(Bundle* bundle);
563*d57664e9SAndroid Build Coastguard Worker status_t addIncludedResources(const sp<AaptFile>& file);
564*d57664e9SAndroid Build Coastguard Worker const ResTable& getIncludedResources() const;
565*d57664e9SAndroid Build Coastguard Worker AssetManager& getAssetManager();
566*d57664e9SAndroid Build Coastguard Worker
567*d57664e9SAndroid Build Coastguard Worker void print(const String8& prefix) const;
568*d57664e9SAndroid Build Coastguard Worker
resDirs()569*d57664e9SAndroid Build Coastguard Worker inline const Vector<sp<AaptDir> >& resDirs() const { return mResDirs; }
570*d57664e9SAndroid Build Coastguard Worker sp<AaptDir> resDir(const String8& name) const;
571*d57664e9SAndroid Build Coastguard Worker
getOverlay()572*d57664e9SAndroid Build Coastguard Worker inline sp<AaptAssets> getOverlay() { return mOverlay; }
setOverlay(sp<AaptAssets> & overlay)573*d57664e9SAndroid Build Coastguard Worker inline void setOverlay(sp<AaptAssets>& overlay) { mOverlay = overlay; }
574*d57664e9SAndroid Build Coastguard Worker
getResources()575*d57664e9SAndroid Build Coastguard Worker inline KeyedVector<String8, sp<ResourceTypeSet> >* getResources() { return mRes; }
576*d57664e9SAndroid Build Coastguard Worker inline void
setResources(KeyedVector<String8,sp<ResourceTypeSet>> * res)577*d57664e9SAndroid Build Coastguard Worker setResources(KeyedVector<String8, sp<ResourceTypeSet> >* res) { delete mRes; mRes = res; }
578*d57664e9SAndroid Build Coastguard Worker
getFullResPaths()579*d57664e9SAndroid Build Coastguard Worker inline sp<FilePathStore>& getFullResPaths() { return mFullResPaths; }
580*d57664e9SAndroid Build Coastguard Worker inline void
setFullResPaths(sp<FilePathStore> & res)581*d57664e9SAndroid Build Coastguard Worker setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; }
582*d57664e9SAndroid Build Coastguard Worker
getFullAssetPaths()583*d57664e9SAndroid Build Coastguard Worker inline sp<FilePathStore>& getFullAssetPaths() { return mFullAssetPaths; }
584*d57664e9SAndroid Build Coastguard Worker inline void
setFullAssetPaths(sp<FilePathStore> & res)585*d57664e9SAndroid Build Coastguard Worker setFullAssetPaths(sp<FilePathStore>& res) { mFullAssetPaths = res; }
586*d57664e9SAndroid Build Coastguard Worker
587*d57664e9SAndroid Build Coastguard Worker private:
588*d57664e9SAndroid Build Coastguard Worker virtual ssize_t slurpFullTree(Bundle* bundle,
589*d57664e9SAndroid Build Coastguard Worker const String8& srcDir,
590*d57664e9SAndroid Build Coastguard Worker const AaptGroupEntry& kind,
591*d57664e9SAndroid Build Coastguard Worker const String8& resType,
592*d57664e9SAndroid Build Coastguard Worker sp<FilePathStore>& fullResPaths,
593*d57664e9SAndroid Build Coastguard Worker const bool overwrite=false);
594*d57664e9SAndroid Build Coastguard Worker
595*d57664e9SAndroid Build Coastguard Worker ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir);
596*d57664e9SAndroid Build Coastguard Worker ssize_t slurpResourceZip(Bundle* bundle, const char* filename);
597*d57664e9SAndroid Build Coastguard Worker
598*d57664e9SAndroid Build Coastguard Worker status_t filter(Bundle* bundle);
599*d57664e9SAndroid Build Coastguard Worker
600*d57664e9SAndroid Build Coastguard Worker String8 mPackage;
601*d57664e9SAndroid Build Coastguard Worker SortedVector<AaptGroupEntry> mGroupEntries;
602*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols;
603*d57664e9SAndroid Build Coastguard Worker DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols;
604*d57664e9SAndroid Build Coastguard Worker String8 mSymbolsPrivatePackage;
605*d57664e9SAndroid Build Coastguard Worker bool mHavePrivateSymbols;
606*d57664e9SAndroid Build Coastguard Worker
607*d57664e9SAndroid Build Coastguard Worker Vector<sp<AaptDir> > mResDirs;
608*d57664e9SAndroid Build Coastguard Worker
609*d57664e9SAndroid Build Coastguard Worker bool mChanged;
610*d57664e9SAndroid Build Coastguard Worker
611*d57664e9SAndroid Build Coastguard Worker bool mHaveIncludedAssets;
612*d57664e9SAndroid Build Coastguard Worker AssetManager mIncludedAssets;
613*d57664e9SAndroid Build Coastguard Worker
614*d57664e9SAndroid Build Coastguard Worker sp<AaptAssets> mOverlay;
615*d57664e9SAndroid Build Coastguard Worker KeyedVector<String8, sp<ResourceTypeSet> >* mRes;
616*d57664e9SAndroid Build Coastguard Worker
617*d57664e9SAndroid Build Coastguard Worker sp<FilePathStore> mFullResPaths;
618*d57664e9SAndroid Build Coastguard Worker sp<FilePathStore> mFullAssetPaths;
619*d57664e9SAndroid Build Coastguard Worker };
620*d57664e9SAndroid Build Coastguard Worker
621*d57664e9SAndroid Build Coastguard Worker #endif // __AAPT_ASSETS_H
622*d57664e9SAndroid Build Coastguard Worker
623