AaptAssets.cpp revision 9ab9b93eae8b2fc747d6101cf0e4c19b2218715f
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2006 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "AaptAssets.h"
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "ResourceFilter.h"
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "Main.h"
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/misc.h>
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/SortedVector.h>
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <ctype.h>
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <dirent.h>
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <errno.h>
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kDefaultLocale = "default";
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kWildcardName = "any";
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kAssetDir = "assets";
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kResourceDir = "res";
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kValuesDir = "values";
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kMipmapDir = "mipmap";
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const char* kInvalidChars = "/\\:";
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const size_t kMaxAssetFileName = 100;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic const String8 kResString(kResourceDir);
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Names of asset files must meet the following criteria:
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  - the filename length must be less than kMaxAssetFileName bytes long
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *    (and can't be empty)
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  - all characters must be 7-bit printable ASCII
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *  - none of { '/' '\\' ':' }
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Pass in just the filename, not the full path.
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic bool validateFileName(const char* fileName)
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* cp = fileName;
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t len = 0;
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*cp != '\0') {
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if ((*cp & 0x80) != 0)
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;           // reject high ASCII
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (*cp < 0x20 || *cp >= 0x7f)
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;           // reject control chars and 0x7f
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (strchr(kInvalidChars, *cp) != NULL)
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;           // reject path sep chars
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        cp++;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        len++;
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (len < 1 || len > kMaxAssetFileName)
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;               // reject empty or too long
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// The default to use if no other ignore pattern is defined.
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst char * const gDefaultIgnoreAssets =
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~";
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// The ignore pattern that can be passed via --ignore-assets in Main.cpp
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst char * gUserIgnoreAssets = NULL;
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic bool isHidden(const char *root, const char *path)
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Patterns syntax:
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - Delimiter is :
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - Entry can start with the flag ! to avoid printing a warning
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //   about the file being ignored.
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - Entry can have the flag "<dir>" to match only directories
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //   or <file> to match only files. Default is to match both.
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //   where prefix/suffix must have at least 1 character (so that
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //   we don't match a '*' catch-all pattern.)
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - The special filenames "." and ".." are always ignored.
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - Otherwise the full string is matched.
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // - match is not case-sensitive.
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) {
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char *delim = ":";
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char *p = gUserIgnoreAssets;
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!p || !p[0]) {
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        p = getenv("ANDROID_AAPT_IGNORE");
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!p || !p[0]) {
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        p = gDefaultIgnoreAssets;
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char *patterns = strdup(p);
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool ignore = false;
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool chatty = true;
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char *matchedPattern = NULL;
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 fullPath(root);
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fullPath.appendPath(path);
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FileType type = getFileType(fullPath);
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int plen = strlen(path);
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Note: we don't have strtok_r under mingw.
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for(char *token = strtok(patterns, delim);
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            !ignore && token != NULL;
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            token = strtok(NULL, delim)) {
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        chatty = token[0] != '!';
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!chatty) token++; // skip !
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (strncasecmp(token, "<dir>" , 5) == 0) {
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type != kFileTypeDirectory) continue;
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            token += 5;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (strncasecmp(token, "<file>", 6) == 0) {
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type != kFileTypeRegular) continue;
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            token += 6;
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        matchedPattern = token;
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int n = strlen(token);
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (token[0] == '*') {
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Match *suffix
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            token++;
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            n--;
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (n <= plen) {
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ignore = strncasecmp(token, path + plen - n, n) == 0;
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (n > 1 && token[n - 1] == '*') {
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Match prefix*
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ignore = strncasecmp(token, path, n - 1) == 0;
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ignore = strcasecmp(token, path) == 0;
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (ignore && chatty) {
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "    (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n",
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                type == kFileTypeDirectory ? "dir" : "file",
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                path,
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                matchedPattern ? matchedPattern : "");
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    free(patterns);
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return ignore;
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value)
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResTable_config config;
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // IMSI - MCC
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMccName(part.string(), &config)) {
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_MCC;
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.mcc;
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // IMSI - MNC
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMncName(part.string(), &config)) {
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_MNC;
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.mnc;
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // locale - language
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_LANGUAGE;
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = part[1] << 8 | part[0];
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // locale - language_REGION
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (part.length() == 5 && isalpha(part[0]) && isalpha(part[1])
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            && part[2] == '_' && isalpha(part[3]) && isalpha(part[4])) {
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_LANGUAGE;
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (part[4] << 24) | (part[3] << 16) | (part[1] << 8) | (part[0]);
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // layout direction
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getLayoutDirectionName(part.string(), &config)) {
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_LAYOUTDIR;
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR);
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // smallest screen dp width
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getSmallestScreenWidthDpName(part.string(), &config)) {
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SMALLESTSCREENWIDTHDP;
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.smallestScreenWidthDp;
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen dp width
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenWidthDpName(part.string(), &config)) {
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENWIDTHDP;
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.screenWidthDp;
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen dp height
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenHeightDpName(part.string(), &config)) {
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENHEIGHTDP;
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.screenHeightDp;
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen layout size
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutSizeName(part.string(), &config)) {
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENLAYOUTSIZE;
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen layout long
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutLongName(part.string(), &config)) {
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENLAYOUTLONG;
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // orientation
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getOrientationName(part.string(), &config)) {
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_ORIENTATION;
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.orientation;
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode type
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeTypeName(part.string(), &config)) {
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_UIMODETYPE;
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode night
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeNightName(part.string(), &config)) {
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_UIMODENIGHT;
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // density
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getDensityName(part.string(), &config)) {
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_DENSITY;
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.density;
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // touchscreen
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getTouchscreenName(part.string(), &config)) {
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_TOUCHSCREEN;
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.touchscreen;
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard hidden
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeysHiddenName(part.string(), &config)) {
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_KEYSHIDDEN;
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.inputFlags;
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeyboardName(part.string(), &config)) {
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_KEYBOARD;
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.keyboard;
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation hidden
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavHiddenName(part.string(), &config)) {
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_NAVHIDDEN;
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.inputFlags;
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavigationName(part.string(), &config)) {
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_NAVIGATION;
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.navigation;
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen size
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenSizeName(part.string(), &config)) {
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENSIZE;
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.screenSize;
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // version
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getVersionName(part.string(), &config)) {
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_VERSION;
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *value = config.version;
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return 1;
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiuint32_t
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis)
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    switch (axis) {
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_MCC:
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.mcc;
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_MNC:
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.mnc;
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_LANGUAGE:
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return (((uint32_t)config.country[1]) << 24) | (((uint32_t)config.country[0]) << 16)
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | (((uint32_t)config.language[1]) << 8) | (config.language[0]);
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_LAYOUTDIR:
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.screenLayout&ResTable_config::MASK_LAYOUTDIR;
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENLAYOUTSIZE:
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.screenLayout&ResTable_config::MASK_SCREENSIZE;
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_ORIENTATION:
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.orientation;
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_UIMODETYPE:
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_UIMODENIGHT:
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_DENSITY:
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.density;
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_TOUCHSCREEN:
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.touchscreen;
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_KEYSHIDDEN:
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.inputFlags;
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_KEYBOARD:
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.keyboard;
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_NAVIGATION:
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.navigation;
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENSIZE:
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.screenSize;
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SMALLESTSCREENWIDTHDP:
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.smallestScreenWidthDp;
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENWIDTHDP:
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.screenWidthDp;
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENHEIGHTDP:
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.screenHeightDp;
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_VERSION:
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return config.version;
349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return 0;
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::configSameExcept(const ResTable_config& config,
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResTable_config& otherConfig, int axis)
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=AXIS_START; i<=AXIS_END; i++) {
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (i == axis) {
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) {
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::initFromDirName(const char* dir, String8* resType)
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mParamsChanged = true;
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<String8> parts;
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den;
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers;
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char *p = dir;
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char *q;
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (NULL != (q = strchr(p, '-'))) {
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 val(p, q-p);
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        val.toLower();
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        parts.add(val);
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("part: %s\n", parts[parts.size()-1].string());
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        p = q+1;
387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 val(p);
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    val.toLower();
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    parts.add(val);
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //printf("part: %s\n", parts[parts.size()-1].string());
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = parts.size();
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int index = 0;
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 part = parts[index];
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // resource type
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!isValidResourceType(part)) {
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    *resType = part;
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    index++;
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (index == N) {
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto success;
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    part = parts[index];
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // imsi - mcc
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMccName(part.string())) {
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mcc = part;
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not mcc: %s\n", part.string());
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // imsi - mnc
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMncName(part.string())) {
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mnc = part;
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not mcc: %s\n", part.string());
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // locale - language
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        loc = part;
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not language: %s\n", part.string());
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // locale - region
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (loc.length() > 0
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            && part.length() == 3 && part[0] == 'r' && part[0] && part[1]) {
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        loc += "-";
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part.toUpper();
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        loc += part.string() + 1;
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not region: %s\n", part.string());
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getLayoutDirectionName(part.string())) {
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutDir = part;
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not layout direction: %s\n", part.string());
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getSmallestScreenWidthDpName(part.string())) {
477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        smallestwidthdp = part;
478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not smallest screen width dp: %s\n", part.string());
486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenWidthDpName(part.string())) {
489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        widthdp = part;
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen width dp: %s\n", part.string());
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenHeightDpName(part.string())) {
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        heightdp = part;
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen height dp: %s\n", part.string());
510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutSizeName(part.string())) {
513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutsize = part;
514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen layout size: %s\n", part.string());
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutLongName(part.string())) {
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutlong = part;
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen layout long: %s\n", part.string());
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // orientation
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getOrientationName(part.string())) {
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        orient = part;
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not orientation: %s\n", part.string());
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode type
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeTypeName(part.string())) {
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uiModeType = part;
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not ui mode type: %s\n", part.string());
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode night
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeNightName(part.string())) {
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uiModeNight = part;
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not ui mode night: %s\n", part.string());
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // density
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getDensityName(part.string())) {
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        den = part;
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not density: %s\n", part.string());
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // touchscreen
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getTouchscreenName(part.string())) {
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        touch = part;
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not touchscreen: %s\n", part.string());
599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard hidden
602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeysHiddenName(part.string())) {
603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        keysHidden = part;
604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not keysHidden: %s\n", part.string());
612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard
615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeyboardName(part.string())) {
616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        key = part;
617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not keyboard: %s\n", part.string());
625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation hidden
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavHiddenName(part.string())) {
629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        navHidden = part;
630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not navHidden: %s\n", part.string());
638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavigationName(part.string())) {
641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nav = part;
642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not navigation: %s\n", part.string());
650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenSizeName(part.string())) {
653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size = part;
654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen size: %s\n", part.string());
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getVersionName(part.string())) {
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        vers = part;
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not version: %s\n", part.string());
674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // if there are extra parts, it doesn't match
677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisuccess:
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->mcc = mcc;
681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->mnc = mnc;
682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->locale = loc;
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenLayoutSize = layoutsize;
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenLayoutLong = layoutlong;
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->smallestScreenWidthDp = smallestwidthdp;
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenWidthDp = widthdp;
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenHeightDp = heightdp;
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->orientation = orient;
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->uiModeType = uiModeType;
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->uiModeNight = uiModeNight;
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->density = den;
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->touchscreen = touch;
693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->keysHidden = keysHidden;
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->keyboard = key;
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->navHidden = navHidden;
696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->navigation = nav;
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenSize = size;
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->layoutDirection = layoutDir;
699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->version = vers;
700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // what is this anyway?
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->vendor = "";
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::toString() const
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 s = this->mcc;
711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += this->mnc;
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += this->locale;
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += layoutDirection;
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += smallestScreenWidthDp;
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenWidthDp;
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenHeightDp;
723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenLayoutSize;
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenLayoutLong;
727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += this->orientation;
729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += uiModeType;
731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += uiModeNight;
733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += density;
735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += touchscreen;
737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += keysHidden;
739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += keyboard;
741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += navHidden;
743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += navigation;
745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenSize;
747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += version;
749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return s;
750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
752282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8
753282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::toDirName(const String8& resType) const
754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 s = resType;
756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->mcc != "") {
757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += mcc;
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->mnc != "") {
763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += mnc;
767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->locale != "") {
769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += locale;
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->layoutDirection != "") {
775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += layoutDirection;
779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->smallestScreenWidthDp != "") {
781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += smallestScreenWidthDp;
785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenWidthDp != "") {
787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenWidthDp;
791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenHeightDp != "") {
793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenHeightDp;
797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenLayoutSize != "") {
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenLayoutSize;
803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenLayoutLong != "") {
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenLayoutLong;
809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->orientation != "") {
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += orientation;
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->uiModeType != "") {
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += uiModeType;
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->uiModeNight != "") {
823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += uiModeNight;
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->density != "") {
829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += density;
833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->touchscreen != "") {
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += touchscreen;
839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->keysHidden != "") {
841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += keysHidden;
845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->keyboard != "") {
847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += keyboard;
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->navHidden != "") {
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += navHidden;
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->navigation != "") {
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += navigation;
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenSize != "") {
865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenSize;
869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
870282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->version != "") {
871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
874282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += version;
875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return s;
878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getMccName(const char* name,
881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = 0;
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* c = name;
888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'm') return false;
889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* val = c;
896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*c != 0) return false;
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (c-val != 3) return false;
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int d = atoi(val);
904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (d != 0) {
905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = d;
906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getMncName(const char* name,
913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = 0;
917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* c = name;
920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'm') return false;
921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'n') return false;
923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* val = c;
928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*c != 0) return false;
933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (c-val == 0 || c-val > 3) return false;
934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->mnc = atoi(val);
937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out->mnc == 0) {
938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->mnc = ACONFIGURATION_MNC_ZERO;
939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Does this directory name fit the pattern of a locale dir ("en-rUS" or
947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * "default")?
948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * TODO: Should insist that the first two letters are lower case, and the
950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * second two are upper.
951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getLocaleName(const char* fileName,
953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                   ResTable_config* out)
954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(fileName, kWildcardName) == 0
956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || strcmp(fileName, kDefaultLocale) == 0) {
957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[0] = 0;
959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[1] = 0;
960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[0] = 0;
961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[1] = 0;
962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strlen(fileName) == 2 && isalpha(fileName[0]) && isalpha(fileName[1])) {
967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[0] = fileName[0];
969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[1] = fileName[1];
970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[0] = 0;
971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[1] = 0;
972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strlen(fileName) == 5 &&
977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        isalpha(fileName[0]) &&
978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        isalpha(fileName[1]) &&
979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fileName[2] == '-' &&
980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        isalpha(fileName[3]) &&
981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        isalpha(fileName[4])) {
982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
983282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[0] = fileName[0];
984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->language[1] = fileName[1];
985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[0] = fileName[3];
986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->country[1] = fileName[4];
987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
992282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out)
995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_ANY;
1000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "ldltr") == 0) {
1002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
1004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_LTR;
1005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "ldrtl") == 0) {
1007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
1009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_RTL;
1010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenLayoutSizeName(const char* name,
1017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_ANY;
1023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "small") == 0) {
1025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_SMALL;
1028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "normal") == 0) {
1030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_NORMAL;
1033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "large") == 0) {
1035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_LARGE;
1038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "xlarge") == 0) {
1040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_XLARGE;
1043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenLayoutLongName(const char* name,
1050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_ANY;
1056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "long") == 0) {
1058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_YES;
1061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notlong") == 0) {
1063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_NO;
1066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getOrientationName(const char* name,
1073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_ANY;
1077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "port") == 0) {
1079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_PORT;
1080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "land") == 0) {
1082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_LAND;
1083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "square") == 0) {
1085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_SQUARE;
1086282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1087282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1088282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1089282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1090282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1091282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getUiModeTypeName(const char* name,
1093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_TYPE_ANY;
1099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "desk") == 0) {
1101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_DESK;
1104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "car") == 0) {
1106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_CAR;
1109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "television") == 0) {
1111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_TELEVISION;
1114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "appliance") == 0) {
1116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
1119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getUiModeNightName(const char* name,
1126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                          ResTable_config* out)
1127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_NIGHT_ANY;
1132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "night") == 0) {
1134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_NIGHT_YES;
1137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notnight") == 0) {
1139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_NIGHT_NO;
1142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getDensityName(const char* name,
1149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
1150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
1153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "nodpi") == 0) {
1157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_NONE;
1158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "ldpi") == 0) {
1162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_LOW;
1163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "mdpi") == 0) {
1167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
1168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "tvdpi") == 0) {
1172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_TV;
1173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "hdpi") == 0) {
1177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_HIGH;
1178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xhdpi") == 0) {
1182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XHIGH;
1183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xxhdpi") == 0) {
1187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
1188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xxxhdpi") == 0) {
1192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
1193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char* c = (char*)name;
1197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
1198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
1199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // check that we have 'dpi' after the last digit.
1202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (toupper(c[0]) != 'D' ||
1203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            toupper(c[1]) != 'P' ||
1204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            toupper(c[2]) != 'I' ||
1205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            c[3] != 0) {
1206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // temporarily replace the first letter with \0 to
1210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // use atoi.
1211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char tmp = c[0];
1212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c[0] = '\0';
1213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int d = atoi(name);
1215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c[0] = tmp;
1216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (d != 0) {
1218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = d;
1219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getTouchscreenName(const char* name,
1226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
1230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notouch") == 0) {
1232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
1233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "stylus") == 0) {
1235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
1236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "finger") == 0) {
1238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
1239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getKeysHiddenName(const char* name,
1246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t mask = 0;
1249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t value = 0;
1250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_ANY;
1253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keysexposed") == 0) {
1254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_NO;
1256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keyshidden") == 0) {
1257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_YES;
1259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keyssoft") == 0) {
1260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_SOFT;
1262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mask != 0) {
1265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
1266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getKeyboardName(const char* name,
1273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_ANY;
1277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "nokeys") == 0) {
1279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
1280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "qwerty") == 0) {
1282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_QWERTY;
1283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "12key") == 0) {
1285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_12KEY;
1286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getNavHiddenName(const char* name,
1293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t mask = 0;
1296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t value = 0;
1297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_ANY;
1300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "navexposed") == 0) {
1301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_NO;
1303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "navhidden") == 0) {
1304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_YES;
1306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mask != 0) {
1309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
1310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getNavigationName(const char* name,
1317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_ANY;
1321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "nonav") == 0) {
1323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_NONAV;
1324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "dpad") == 0) {
1326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_DPAD;
1327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "trackball") == 0) {
1329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
1330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "wheel") == 0) {
1332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_WHEEL;
1333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
1340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenWidth = out->SCREENWIDTH_ANY;
1344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenHeight = out->SCREENHEIGHT_ANY;
1345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || *x != 'x') return false;
1352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    x++;
1354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* y = x;
1356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*y >= '0' && *y <= '9') y++;
1357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (y == name || *y != 0) return false;
1358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 yName(x, y-x);
1359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint16_t w = (uint16_t)atoi(xName.string());
1361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint16_t h = (uint16_t)atoi(yName.string());
1362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (w < h) {
1363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenWidth = w;
1368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenHeight = h;
1369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
1375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
1379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 's') return false;
1384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'w') return false;
1386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
1394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
1400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenWidthDp = out->SCREENWIDTH_ANY;
1404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'w') return false;
1409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenWidthDp = (uint16_t)atoi(xName.string());
1417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
1423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenHeightDp = out->SCREENWIDTH_ANY;
1427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'h') return false;
1432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenHeightDp = (uint16_t)atoi(xName.string());
1440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
1446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->sdkVersion = out->SDKVERSION_ANY;
1450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->minorVersion = out->MINORVERSION_ANY;
1451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'v') {
1456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* s = name;
1461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*s >= '0' && *s <= '9') s++;
1462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (s == name || *s != 0) return false;
1463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 sdkName(name, s-name);
1464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->sdkVersion = (uint16_t)atoi(sdkName.string());
1467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->minorVersion = 0;
1468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint AaptGroupEntry::compare(const AaptGroupEntry& o) const
1474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int v = mcc.compare(o.mcc);
1476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = mnc.compare(o.mnc);
1477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = locale.compare(o.locale);
1478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = layoutDirection.compare(o.layoutDirection);
1479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = vendor.compare(o.vendor);
1480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
1481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
1482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
1483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
1484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
1485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = orientation.compare(o.orientation);
1486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = uiModeType.compare(o.uiModeType);
1487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = uiModeNight.compare(o.uiModeNight);
1488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = density.compare(o.density);
1489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = touchscreen.compare(o.touchscreen);
1490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = keysHidden.compare(o.keysHidden);
1491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = keyboard.compare(o.keyboard);
1492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = navHidden.compare(o.navHidden);
1493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = navigation.compare(o.navigation);
1494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenSize.compare(o.screenSize);
1495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = version.compare(o.version);
1496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return v;
1497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst ResTable_config& AaptGroupEntry::toParams() const
1500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mParamsChanged) {
1502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParams;
1503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mParamsChanged = false;
1506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResTable_config& params(mParams);
1507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memset(&params, 0, sizeof(params));
1508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getMccName(mcc.string(), &params);
1509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getMncName(mnc.string(), &params);
1510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getLocaleName(locale.string(), &params);
1511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getLayoutDirectionName(layoutDirection.string(), &params);
1512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
1513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenWidthDpName(screenWidthDp.string(), &params);
1514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenHeightDpName(screenHeightDp.string(), &params);
1515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
1516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenLayoutLongName(screenLayoutLong.string(), &params);
1517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getOrientationName(orientation.string(), &params);
1518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getUiModeTypeName(uiModeType.string(), &params);
1519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getUiModeNightName(uiModeNight.string(), &params);
1520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getDensityName(density.string(), &params);
1521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getTouchscreenName(touchscreen.string(), &params);
1522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getKeysHiddenName(keysHidden.string(), &params);
1523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getKeyboardName(keyboard.string(), &params);
1524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getNavHiddenName(navHidden.string(), &params);
1525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getNavigationName(navigation.string(), &params);
1526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenSizeName(screenSize.string(), &params);
1527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getVersionName(version.string(), &params);
1528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Fix up version number based on specified parameters.
1530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int minSdk = 0;
1531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
1532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
1533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
1534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_HONEYCOMB_MR2;
1535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
1536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::UI_MODE_TYPE_ANY
1537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
1538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::UI_MODE_NIGHT_ANY) {
1539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_FROYO;
1540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
1541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::SCREENSIZE_ANY
1542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||  (params.screenLayout&ResTable_config::MASK_SCREENLONG)
1543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::SCREENLONG_ANY
1544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.density != ResTable_config::DENSITY_DEFAULT) {
1545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_DONUT;
1546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (minSdk > params.sdkVersion) {
1549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        params.sdkVersion = minSdk;
1550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return params;
1553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::editData(size_t size)
1560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (size <= mBufferSize) {
1562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mDataSize = size;
1563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mData;
1564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t allocSize = (size*3)/2;
1566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* buf = realloc(mData, allocSize);
1567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (buf == NULL) {
1568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NULL;
1569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mData = buf;
1571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDataSize = size;
1572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mBufferSize = allocSize;
1573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return buf;
1574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::editData(size_t* outSize)
1577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (outSize) {
1579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *outSize = mDataSize;
1580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mData;
1582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::padData(size_t wordSize)
1585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t extra = mDataSize%wordSize;
1587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (extra == 0) {
1588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mData;
1589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t initial = mDataSize;
1592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* data = editData(initial+(wordSize-extra));
1593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (data != NULL) {
1594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memset(((uint8_t*)data) + initial, 0, wordSize-extra);
1595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return data;
1597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptFile::writeData(const void* data, size_t size)
1600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t end = mDataSize;
1602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t total = size + end;
1603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* buf = editData(total);
1604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (buf == NULL) {
1605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return UNKNOWN_ERROR;
1606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memcpy(((char*)buf)+end, data, size);
1608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptFile::clearData()
1612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mData != NULL) free(mData);
1614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mData = NULL;
1615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDataSize = 0;
1616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mBufferSize = 0;
1617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1619282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptFile::getPrintableSource() const
1620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (hasData()) {
1622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 name(mGroupEntry.toDirName(String8()));
1623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        name.appendPath(mPath);
1624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        name.append(" #generated");
1625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return name;
1626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mSourceFile;
1628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptGroup::addFile(const sp<AaptFile>& file)
1635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.indexOfKey(file->getGroupEntry()) < 0) {
1637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        file->mPath = mPath;
1638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mFiles.add(file->getGroupEntry(), file);
1639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NO_ERROR;
1640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
1643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n",
1644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file->getSourceFile().string(),
1645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file->getGroupEntry().toDirName(String8()).string(),
1646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLeaf.string(), mPath.string());
1647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
1648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.",
1650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                               getPrintableSource().string());
1651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return UNKNOWN_ERROR;
1652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptGroup::removeFile(size_t index)
1655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski	mFiles.removeItemsAt(index);
1657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptGroup::print(const String8& prefix) const
1660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("%s%s\n", prefix.string(), getPath().string());
1662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N=mFiles.size();
1663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
1664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
1665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> file = mFiles.valueAt(i);
1666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const AaptGroupEntry& e = file->getGroupEntry();
1667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (file->hasData()) {
1668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("%s  Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(),
1669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    (int)file->getSize());
1670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
1671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("%s  Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(),
1672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    file->getPrintableSource().string());
1673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("%s  File Group Entry: %s\n", prefix.string(),
1675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //        file->getGroupEntry().toDirName(String8()).string());
1676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1679282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptGroup::getPrintableSource() const
1680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.size() > 0) {
1682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Arbitrarily pull the first source file out of the list.
1683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mFiles.valueAt(0)->getPrintableSource();
1684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Should never hit this case, but to be safe...
1687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return getPath();
1688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file)
1696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.indexOfKey(name) >= 0) {
1698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ALREADY_EXISTS;
1699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mFiles.add(name, file);
1701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir)
1705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mDirs.indexOfKey(name) >= 0) {
1707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ALREADY_EXISTS;
1708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDirs.add(name, dir);
1710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptDir> AaptDir::makeDir(const String8& path)
1714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 name;
1716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 remain = path;
1717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> subdir = this;
1719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (name = remain.walkPath(&remain), remain != "") {
1720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        subdir = subdir->makeDir(name);
1721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t i = subdir->mDirs.indexOfKey(name);
1724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (i >= 0) {
1725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return subdir->mDirs.valueAt(i);
1726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name));
1728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    subdir->mDirs.add(name, dir);
1729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return dir;
1730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::removeFile(const String8& name)
1733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mFiles.removeItem(name);
1735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::removeDir(const String8& name)
1738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDirs.removeItem(name);
1740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file)
1743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> group;
1745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.indexOfKey(leafName) >= 0) {
1746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        group = mFiles.valueFor(leafName);
1747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
1748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        group = new AaptGroup(leafName, mPath.appendPathCopy(leafName));
1749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mFiles.add(leafName, group);
1750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return group->addFile(file);
1753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
1756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            const AaptGroupEntry& kind, const String8& resType,
1757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            sp<FilePathStore>& fullResPaths)
1758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<String8> fileNames;
1760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
1761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DIR* dir = NULL;
1762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        dir = opendir(srcDir.string());
1764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir == NULL) {
1765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
1766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
1767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /*
1770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * Slurp the filenames out of the directory.
1771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         */
1772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        while (1) {
1773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            struct dirent* entry;
1774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entry = readdir(dir);
1776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (entry == NULL)
1777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                break;
1778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (isHidden(srcDir.string(), entry->d_name))
1780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                continue;
1781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String8 name(entry->d_name);
1783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fileNames.add(name);
1784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Add fully qualified path for dependency purposes
1785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // if we're collecting them
1786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (fullResPaths != NULL) {
1787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fullResPaths->add(srcDir.appendPathCopy(name));
1788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        closedir(dir);
1791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t count = 0;
1794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
1796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Stash away the files and recursively descend into subdirectories.
1797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
1798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N = fileNames.size();
1799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
1800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < N; i++) {
1801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 pathName(srcDir);
1802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type;
1803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        pathName.appendPath(fileNames[i].string());
1805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type = getFileType(pathName.string());
1806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeDirectory) {
1807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> subdir;
1808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            bool notAdded = false;
1809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mDirs.indexOfKey(fileNames[i]) >= 0) {
1810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                subdir = mDirs.valueFor(fileNames[i]);
1811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
1812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i]));
1813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                notAdded = true;
1814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
1816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                resType, fullResPaths);
1817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res < NO_ERROR) {
1818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return res;
1819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res > 0 && notAdded) {
1821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mDirs.add(fileNames[i], subdir);
1822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count += res;
1824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (type == kFileTypeRegular) {
1825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptFile> file = new AaptFile(pathName, kind, resType);
1826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            status_t err = addLeafFile(fileNames[i], file);
1827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (err != NO_ERROR) {
1828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return err;
1829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count++;
1832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
1834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose())
1835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf("   (ignoring non-file/dir '%s')\n", pathName.string());
1836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
1840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::validate() const
1843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NF = mFiles.size();
1845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND = mDirs.size();
1846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
1847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < NF; i++) {
1848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) {
1849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
1850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    "Invalid filename.  Unable to add.");
1851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
1852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t j;
1855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = i+1; j < NF; j++) {
1856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
1857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mFiles.valueAt(j)->getLeaf().string()) == 0) {
1858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
1859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "File is case-insensitive equivalent to: %s",
1860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mFiles.valueAt(j)->getPrintableSource().string());
1861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
1862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // TODO: if ".gz", check for non-.gz; if non-, check for ".gz"
1865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // (this is mostly caught by the "marked" stuff, below)
1866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = 0; j < ND; j++) {
1869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
1870282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
1871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
1872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "File conflicts with dir from: %s",
1873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mDirs.valueAt(j)->getPrintableSource().string());
1874282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
1875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < ND; i++) {
1880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) {
1881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
1882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    "Invalid directory name, unable to add.");
1883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
1884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t j;
1887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = i+1; j < ND; j++) {
1888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(),
1889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
1890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
1891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "Directory is case-insensitive equivalent to: %s",
1892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mDirs.valueAt(j)->getPrintableSource().string());
1893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
1894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = mDirs.valueAt(i)->validate();
1898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
1899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return err;
1900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::print(const String8& prefix) const
1907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND=getDirs().size();
1909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
1910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<ND; i++) {
1911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        getDirs().valueAt(i)->print(prefix);
1912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NF=getFiles().size();
1915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<NF; i++) {
1916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        getFiles().valueAt(i)->print(prefix);
1917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1920282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptDir::getPrintableSource() const
1921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.size() > 0) {
1923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Arbitrarily pull the first file out of the list as the source dir.
1924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mFiles.valueAt(0)->getPrintableSource().getPathDir();
1925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mDirs.size() > 0) {
1927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Or arbitrarily pull the first dir out of the list as the source dir.
1928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mDirs.valueAt(0)->getPrintableSource().getPathDir();
1929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Should never hit this case, but to be safe...
1932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mPath;
1933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
1941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = NO_ERROR;
1943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N = javaSymbols->mSymbols.size();
1944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
1945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = javaSymbols->mSymbols.keyAt(i);
1946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
1947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mSymbols.indexOfKey(name);
1948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
1949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
1950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = UNKNOWN_ERROR;
1951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
1952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
1954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //        i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
1955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
1956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = javaSymbols->mNestedSymbols.size();
1959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
1960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
1961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
1962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mNestedSymbols.indexOfKey(name);
1963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
1964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos pos;
1965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pos.error("Java symbol dir %s not defined\n", name.string());
1966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = UNKNOWN_ERROR;
1967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
1968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** applying java symbols in dir %s\n", name.string());
1970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
1971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (myerr != NO_ERROR) {
1972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = myerr;
1973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return err;
1977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1983282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptAssets::AaptAssets()
1984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    : AaptDir(String8(), String8()),
1985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
1986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const {
1990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mChanged) {
1991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1992282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mGroupEntries;
1993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file)
1996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mChanged = true;
1998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return AaptDir::addFile(name, file);
1999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptFile> AaptAssets::addFile(
2002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& filePath, const AaptGroupEntry& entry,
2003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& srcDir, sp<AaptGroup>* outGroup,
2004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& resType)
2005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> dir = this;
2007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> group;
2008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptFile> file;
2009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 root, remain(filePath), partialPath;
2010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (remain.length() > 0) {
2011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        root = remain.walkPath(&remain);
2012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        partialPath.appendPath(root);
2013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8 rootStr(root);
2015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (remain.length() == 0) {
2017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t i = dir->getFiles().indexOfKey(rootStr);
2018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (i >= 0) {
2019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                group = dir->getFiles().valueAt(i);
2020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
2021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                group = new AaptGroup(rootStr, filePath);
2022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                status_t res = dir->addFile(rootStr, group);
2023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (res != NO_ERROR) {
2024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return NULL;
2025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType);
2028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            status_t res = group->addFile(file);
2029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res != NO_ERROR) {
2030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return NULL;
2031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
2033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t i = dir->getDirs().indexOfKey(rootStr);
2036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (i >= 0) {
2037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                dir = dir->getDirs().valueAt(i);
2038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
2039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                sp<AaptDir> subdir = new AaptDir(rootStr, partialPath);
2040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                status_t res = dir->addDir(rootStr, subdir);
2041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (res != NO_ERROR) {
2042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return NULL;
2043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                dir = subdir;
2045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mGroupEntries.add(entry);
2050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (outGroup) *outGroup = group;
2051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return file;
2052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptAssets::addResource(const String8& leafName, const String8& path,
2055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                const sp<AaptFile>& file, const String8& resType)
2056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> res = AaptDir::makeDir(kResString);
2058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 dirname = file->getGroupEntry().toDirName(resType);
2059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> subdir = res->makeDir(dirname);
2060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> grr = new AaptGroup(leafName, path);
2061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    grr->addFile(file);
2062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    subdir->addFile(leafName, grr);
2064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpFromArgs(Bundle* bundle)
2068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int count;
2070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int totalCount = 0;
2071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FileType type;
2072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
2073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t dirCount =resDirs.size();
2074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptAssets> current = this;
2075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = bundle->getFileSpecCount();
2077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a package manifest was specified, include that first.
2080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (bundle->getAndroidManifestFile() != NULL) {
2082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // place at root of zip.
2083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 srcFile(bundle->getAndroidManifestFile());
2084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(),
2085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                NULL, String8());
2086282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount++;
2087282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2088282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2089282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2090282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a directory of custom assets was supplied, slurp 'em up.
2091282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (bundle->getAssetSourceDir()) {
2093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* assetDir = bundle->getAssetSourceDir();
2094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type = getFileType(assetDir);
2096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeNonexistent) {
2097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDir);
2098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type != kFileTypeDirectory) {
2101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
2102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 assetRoot(assetDir);
2106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
2107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry group;
2108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
2109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                            String8(), mFullAssetPaths);
2110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count < 0) {
2111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            totalCount = count;
2112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count > 0) {
2115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGroupEntries.add(group);
2116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount += count;
2118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getVerbose())
2120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Found %d custom asset file%s in %s\n",
2121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                   count, (count==1) ? "" : "s", assetDir);
2122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a directory of resource-specific assets was supplied, slurp 'em up.
2126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<dirCount; i++) {
2128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char *res = resDirs[i];
2129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (res) {
2130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            type = getFileType(res);
2131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type == kFileTypeNonexistent) {
2132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
2133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type == kFileTypeDirectory) {
2136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (i>0) {
2137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    sp<AaptAssets> nextOverlay = new AaptAssets();
2138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current->setOverlay(nextOverlay);
2139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current = nextOverlay;
2140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current->setFullResPaths(mFullResPaths);
2141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count = current->slurpResourceTree(bundle, String8(res));
21439ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                if (i > 0 && count > 0) {
21449ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                  count = current->filter(bundle);
21459ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                }
2146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (count < 0) {
2148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    totalCount = count;
2149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    goto bail;
2150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                totalCount += count;
2152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            else {
2154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
2155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Now do any additional raw files.
2162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int arg=0; arg<N; arg++) {
2164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* assetDir = bundle->getFileSpecEntry(arg);
2165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type = getFileType(assetDir);
2167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeNonexistent) {
2168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir);
2169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type != kFileTypeDirectory) {
2172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
2173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 assetRoot(assetDir);
2177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getVerbose())
2179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Processing raw dir '%s'\n", (const char*) assetDir);
2180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /*
2182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * Do a recursive traversal of subdir tree.  We don't make any
2183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * guarantees about ordering, so we're okay with an inorder search
2184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * using whatever order the OS happens to hand back to us.
2185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         */
2186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
2187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count < 0) {
2188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* failure; report error and remove archive */
2189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            totalCount = count;
2190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount += count;
2193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getVerbose())
2195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Found %d asset file%s in %s\n",
2196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                   count, (count==1) ? "" : "s", assetDir);
2197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    count = validate();
2200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (count != NO_ERROR) {
2201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount = count;
2202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto bail;
2203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    count = filter(bundle);
2206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (count != NO_ERROR) {
2207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount = count;
2208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto bail;
2209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return totalCount;
2213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
2216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const AaptGroupEntry& kind,
2217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const String8& resType,
2218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    sp<FilePathStore>& fullResPaths)
2219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
2221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (res > 0) {
2222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mGroupEntries.add(kind);
2223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return res;
2226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
2229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t err = 0;
2231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DIR* dir = opendir(srcDir.string());
2233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (dir == NULL) {
2234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
2235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return UNKNOWN_ERROR;
2236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t count = 0;
2239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Run through the directory, looking for dirs that match the
2242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * expected pattern.
2243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (1) {
2245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        struct dirent* entry = readdir(dir);
2246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entry == NULL) {
2247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
2248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (isHidden(srcDir.string(), entry->d_name)) {
2251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 subdirName(srcDir);
2255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        subdirName.appendPath(entry->d_name);
2256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry group;
2258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 resType;
2259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool b = group.initFromDirName(entry->d_name, &resType);
2260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!b) {
2261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(),
2262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    entry->d_name);
2263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = -1;
2264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) {
2268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int maxResInt = atoi(bundle->getMaxResVersion());
2269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            const char *verString = group.getVersionString().string();
2270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int dirVersionInt = atoi(verString + 1); // skip 'v' in version name
2271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (dirVersionInt > maxResInt) {
2272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name);
2273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              continue;
2274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type = getFileType(subdirName.string());
2278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeDirectory) {
2280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> dir = makeDir(resType);
2281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
2282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                resType, mFullResPaths);
2283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res < 0) {
2284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count = res;
2285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                goto bail;
2286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res > 0) {
2288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mGroupEntries.add(group);
2289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count += res;
2290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Only add this directory if we don't already have a resource dir
2293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // for the current type.  This ensures that we only add the dir once
2294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // for all configs.
2295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> rdir = resDir(resType);
2296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (rdir == NULL) {
2297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mResDirs.add(dir);
2298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose()) {
2301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "   (ignoring file '%s')\n", subdirName.string());
2302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    closedir(dir);
2308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    dir = NULL;
2309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != 0) {
2311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
2314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t
2317282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
2318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int count = 0;
2320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SortedVector<AaptGroupEntry> entries;
2321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipFile* zip = new ZipFile;
2323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = zip->open(filename, ZipFile::kOpenReadOnly);
2324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "error opening zip file %s\n", filename);
2326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = err;
2327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        delete zip;
2328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
2329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = zip->getNumEntries();
2332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<N; i++) {
2333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ZipEntry* entry = zip->getEntryByIndex(i);
2334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entry->getDeleted()) {
2335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 entryName(entry->getFileName());
2339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 dirName = entryName.getPathDir();
2341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName);
2342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 resType;
2344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry kind;
2345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 remain;
2347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entryName.walkPath(&remain) == kResourceDir) {
2348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // these are the resources, pull their type out of the directory name
2349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kind.initFromDirName(remain.walkPath().string(), &resType);
2350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // these are untyped and don't have an AaptGroupEntry
2352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entries.indexOf(kind) < 0) {
2354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entries.add(kind);
2355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGroupEntries.add(kind);
2356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // use the one from the zip file if they both exist.
2359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        dir->removeFile(entryName.getPathLeaf());
2360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> file = new AaptFile(entryName, kind, resType);
2362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = dir->addLeafFile(entryName.getPathLeaf(), file);
2363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
2364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string());
2365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count = err;
2366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        file->setCompressionMethod(entry->getCompressionMethod());
2369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
2371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entryName == "AndroidManifest.xml") {
2372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("AndroidManifest.xml\n");
2373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("\n\nfile: %s\n", entryName.string());
2375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
2376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t len = entry->getUncompressedLen();
2378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void* data = zip->uncompress(entry);
2379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void* buf = file->editData(len);
2380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memcpy(buf, data, len);
2381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
2383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const int OFF = 0;
2384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const unsigned char* p = (unsigned char*)data;
2385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const unsigned char* end = p+len;
2386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        p += OFF;
2387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int i=0; i<32 && p < end; i++) {
2388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("0x%03x ", i*0x10 + OFF);
2389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int j=0; j<0x10 && p < end; j++) {
2390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf(" %02x", *p);
2391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                p++;
2392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("\n");
2394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
2396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(data);
2398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count++;
2400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    delete zip;
2404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
2405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::filter(Bundle* bundle)
2408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResourceFilter reqFilter;
2410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = reqFilter.parse(bundle->getConfigurations());
2411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResourceFilter prefFilter;
2416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    err = prefFilter.parse(bundle->getPreferredConfigurations());
2417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (reqFilter.isEmpty() && prefFilter.isEmpty()) {
2422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NO_ERROR;
2423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (bundle->getVerbose()) {
2426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!reqFilter.isEmpty()) {
2427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Applying required filter: %s\n",
2428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bundle->getConfigurations());
2429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!prefFilter.isEmpty()) {
2431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Applying preferred filter: %s\n",
2432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bundle->getPreferredConfigurations());
2433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND = resdirs.size();
2438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<ND; i++) {
2439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& dir = resdirs.itemAt(i);
2440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir->getLeaf() == kValuesDir) {
2441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // The "value" dir is special since a single file defines
2442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // multiple resources, so we can not do filtering on the
2443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // files themselves.
2444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir->getLeaf() == kMipmapDir) {
2447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // We also skip the "mipmap" directory, since the point of this
2448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // is to include all densities without stripping.  If you put
2449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // other configurations in here as well they won't be stripped
2450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // either...  So don't do that.  Seriously.  What is wrong with you?
2451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const size_t NG = dir->getFiles().size();
2455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (size_t j=0; j<NG; j++) {
2456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptGroup> grp = dir->getFiles().valueAt(j);
2457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // First remove any configurations we know we don't need.
2459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (size_t k=0; k<grp->getFiles().size(); k++) {
2460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                sp<AaptFile> file = grp->getFiles().valueAt(k);
2461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (k == 0 && grp->getFiles().size() == 1) {
2462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // If this is the only file left, we need to keep it.
2463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // Otherwise the resource IDs we are using will be inconsistent
2464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // with what we get when not stripping.  Sucky, but at least
2465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // for now we can rely on the back-end doing another filtering
2466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // pass to take this out and leave us with this resource name
2467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // containing no entries.
2468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
2469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (file->getPath().getPathExtension() == ".xml") {
2471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // We can't remove .xml files at this point, because when
2472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // we parse them they may add identifier resources, so
2473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // removing them can cause our resource identifiers to
2474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // become inconsistent.
2475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
2476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                const ResTable_config& config(file->getGroupEntry().toParams());
2478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (!reqFilter.match(config)) {
2479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (bundle->getVerbose()) {
2480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        printf("Pruning unneeded resource: %s\n",
2481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                file->getPrintableSource().string());
2482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    grp->removeFile(k);
2484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    k--;
2485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Quick check: no preferred filters, nothing more to do.
2489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (prefFilter.isEmpty()) {
2490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                continue;
2491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
24938cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // Get the preferred density if there is one. We do not match exactly for density.
24948cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we
24958cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // pick xhdpi.
24968cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            uint32_t preferredDensity = 0;
24978cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            const SortedVector<uint32_t>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY);
24988cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            if (preferredConfigs != NULL && preferredConfigs->size() > 0) {
24998cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                preferredDensity = (*preferredConfigs)[0];
25008cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            }
25018cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
2502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Now deal with preferred configurations.
2503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int axis=AXIS_START; axis<=AXIS_END; axis++) {
2504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                for (size_t k=0; k<grp->getFiles().size(); k++) {
2505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    sp<AaptFile> file = grp->getFiles().valueAt(k);
2506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (k == 0 && grp->getFiles().size() == 1) {
2507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // If this is the only file left, we need to keep it.
2508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // Otherwise the resource IDs we are using will be inconsistent
2509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // with what we get when not stripping.  Sucky, but at least
2510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // for now we can rely on the back-end doing another filtering
2511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // pass to take this out and leave us with this resource name
2512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // containing no entries.
2513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        continue;
2514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (file->getPath().getPathExtension() == ".xml") {
2516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // We can't remove .xml files at this point, because when
2517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // we parse them they may add identifier resources, so
2518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // removing them can cause our resource identifiers to
2519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // become inconsistent.
2520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        continue;
2521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config& config(file->getGroupEntry().toParams());
2523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (!prefFilter.match(axis, config)) {
2524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // This is a resource we would prefer not to have.  Check
2525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // to see if have a similar variation that we would like
2526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // to have and, if so, we can drop it.
25278cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
25288cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        uint32_t bestDensity = config.density;
25298cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
2530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        for (size_t m=0; m<grp->getFiles().size(); m++) {
2531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            if (m == k) continue;
2532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            sp<AaptFile> mfile = grp->getFiles().valueAt(m);
2533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            const ResTable_config& mconfig(mfile->getGroupEntry().toParams());
2534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) {
25358cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                if (axis == AXIS_DENSITY && preferredDensity > 0) {
25368cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    // See if there is a better density resource
25378cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    if (mconfig.density < bestDensity &&
25388cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            mconfig.density > preferredDensity &&
25398cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            bestDensity > preferredDensity) {
25408cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // This density is between our best density and
25418cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // the preferred density, therefore it is better.
25428cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        bestDensity = mconfig.density;
25438cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    } else if (mconfig.density > bestDensity &&
25448cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            bestDensity < preferredDensity) {
25458cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // This density is better than our best density and
25468cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // our best density was smaller than our preferred
25478cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // density, so it is better.
25488cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        bestDensity = mconfig.density;
25498cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    }
25508cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                } else if (prefFilter.match(axis, mconfig)) {
2551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    if (bundle->getVerbose()) {
2552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        printf("Pruning unneeded resource: %s\n",
2553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                file->getPrintableSource().string());
2554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    }
2555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    grp->removeFile(k);
2556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    k--;
2557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    break;
2558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
2559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            }
2560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
25618cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
25628cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        if (axis == AXIS_DENSITY && preferredDensity > 0 &&
25638cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                bestDensity != config.density) {
25648cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            if (bundle->getVerbose()) {
25658cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                printf("Pruning unneeded resource: %s\n",
25668cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        file->getPrintableSource().string());
25678cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            }
25688cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            grp->removeFile(k);
25698cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            k--;
25708cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        }
2571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
2581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptSymbols> sym = mSymbols.valueFor(name);
2583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym == NULL) {
2584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sym = new AaptSymbols();
2585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSymbols.add(name, sym);
2586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return sym;
2588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
2591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
2593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym == NULL) {
2594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sym = new AaptSymbols();
2595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mJavaSymbols.add(name, sym);
2596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return sym;
2598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::applyJavaSymbols()
2601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N = mJavaSymbols.size();
2603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = mJavaSymbols.keyAt(i);
2605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
2606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mSymbols.indexOfKey(name);
2607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
2608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos pos;
2609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pos.error("Java symbol dir %s not defined\n", name.string());
2610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** applying java symbols in dir %s\n", name.string());
2613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
2614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
2615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return err;
2616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
2623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
2624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //        sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
2625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //        sym.isJavaSymbol ? 1 : 0);
2626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mHavePrivateSymbols) return true;
2627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym.isPublic) return true;
2628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (includePrivate && sym.isJavaSymbol) return true;
2629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
2630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::buildIncludedResources(Bundle* bundle)
2633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mHaveIncludedAssets) {
2635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Add in all includes.
2636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<const char*>& incl = bundle->getPackageIncludes();
2637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const size_t N=incl.size();
2638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (size_t i=0; i<N; i++) {
2639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose())
2640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf("Including resources from package: %s\n", incl[i]);
2641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) {
2642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: Asset package include '%s' not found.\n",
2643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        incl[i]);
2644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mHaveIncludedAssets = true;
2648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::addIncludedResources(const sp<AaptFile>& file)
2654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const ResTable& res = getIncludedResources();
2656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // XXX dirty!
2657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return const_cast<ResTable&>(res).add(file->getData(), file->getSize(), NULL);
2658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst ResTable& AaptAssets::getIncludedResources() const
2661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mIncludedAssets.getResources(false);
2663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptAssets::print(const String8& prefix) const
2666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 innerPrefix(prefix);
2668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    innerPrefix.append("  ");
2669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 innerInnerPrefix(innerPrefix);
2670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    innerInnerPrefix.append("  ");
2671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("%sConfigurations:\n", prefix.string());
2672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N=mGroupEntries.size();
2673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 cname = mGroupEntries.itemAt(i).toDirName(String8());
2675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("%s %s\n", prefix.string(),
2676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                cname != "" ? cname.string() : "(default)");
2677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("\n%sFiles:\n", prefix.string());
2680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    AaptDir::print(innerPrefix);
2681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("\n%sResource Dirs:\n", prefix.string());
2683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NR = resdirs.size();
2685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<NR; i++) {
2686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& d = resdirs.itemAt(i);
2687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("%s  Type %s\n", prefix.string(), d->getLeaf().string());
2688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        d->print(innerInnerPrefix);
2689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptDir> AaptAssets::resDir(const String8& name) const
2693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N = resdirs.size();
2696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& d = resdirs.itemAt(i);
2698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (d->getLeaf() == name) {
2699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return d;
2700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NULL;
2703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
2706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivalid_symbol_name(const String8& symbol)
2707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static char const * const KEYWORDS[] = {
2709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "abstract", "assert", "boolean", "break",
2710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "byte", "case", "catch", "char", "class", "const", "continue",
2711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "default", "do", "double", "else", "enum", "extends", "final",
2712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "finally", "float", "for", "goto", "if", "implements", "import",
2713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "instanceof", "int", "interface", "long", "native", "new", "package",
2714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "private", "protected", "public", "return", "short", "static",
2715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "strictfp", "super", "switch", "synchronized", "this", "throw",
2716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "throws", "transient", "try", "void", "volatile", "while",
2717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "true", "false", "null",
2718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        NULL
2719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
2720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char*const* k = KEYWORDS;
2721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char*const s = symbol.string();
2722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*k) {
2723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (0 == strcmp(s, *k)) {
2724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
2725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        k++;
2727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
2729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2730