xref: /aosp_15_r20/frameworks/base/tools/aapt/AaptAssets.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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