AaptAssets.cpp revision de898ff42912bd7ca1bfb099cd439562496765a4
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
15291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath/* static */ void AaptLocaleValue::splitAndLowerCase(const char* const chars,
15391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        Vector<String8>* parts, const char separator) {
15491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    const char *p = chars;
15591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    const char *q;
15691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    while (NULL != (q = strchr(p, separator))) {
15791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         String8 val(p, q - p);
15891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         val.toLower();
15991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         parts->add(val);
16091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         p = q+1;
16191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
16291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
16391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (p < chars + strlen(chars)) {
16491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        String8 val(p);
16591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        val.toLower();
16691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        parts->add(val);
16791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
16891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
16991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
17091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath/* static */
17191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathinline bool isAlpha(const String8& string) {
17291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const size_t length = string.length();
17391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     for (size_t i = 0; i < length; ++i) {
17491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          if (!isalpha(string[i])) {
17591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath              return false;
17691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          }
17791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
17891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
17991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     return true;
18091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
18191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
18291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath/* static */
18391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathinline bool isNumber(const String8& string) {
18491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const size_t length = string.length();
18591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     for (size_t i = 0; i < length; ++i) {
18691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          if (!isdigit(string[i])) {
18791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath              return false;
18891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          }
18991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
19091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
19191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     return true;
19291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
19391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
19491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::setLanguage(const char* languageChars) {
19591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     size_t i = 0;
19691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     while ((*languageChars) != '\0') {
19791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          language[i++] = tolower(*languageChars);
19891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          languageChars++;
19991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
20091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
20191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
20291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::setRegion(const char* regionChars) {
20391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    size_t i = 0;
20491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    while ((*regionChars) != '\0') {
20591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         region[i++] = toupper(*regionChars);
20691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         regionChars++;
20791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
20891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
20991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
21091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::setScript(const char* scriptChars) {
21191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    size_t i = 0;
21291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    while ((*scriptChars) != '\0') {
21391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         if (i == 0) {
21491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath             script[i++] = toupper(*scriptChars);
21591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         } else {
21691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath             script[i++] = tolower(*scriptChars);
21791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         }
21891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         scriptChars++;
21991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
22091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
22191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
22291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::setVariant(const char* variantChars) {
22391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     size_t i = 0;
22491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     while ((*variantChars) != '\0') {
22591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          variant[i++] = *variantChars;
22691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath          variantChars++;
22791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
22891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
22991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
23091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathbool AaptLocaleValue::initFromFilterString(const String8& str) {
23191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     // A locale (as specified in the filter) is an underscore separated name such
23291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     // as "en_US", "en_Latn_US", or "en_US_POSIX".
23391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     Vector<String8> parts;
23491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     splitAndLowerCase(str.string(), &parts, '_');
23591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
23691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const int numTags = parts.size();
23791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     bool valid = false;
23891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (numTags >= 1) {
23991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         const String8& lang = parts[0];
24091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
24191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath             setLanguage(lang.string());
24291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath             valid = true;
24391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         }
24491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
24591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
24691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (!valid || numTags == 1) {
24791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         return valid;
24891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
24991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
25091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     // At this point, valid == true && numTags > 1.
25191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const String8& part2 = parts[1];
25291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if ((part2.length() == 2 && isAlpha(part2)) ||
25391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         (part2.length() == 3 && isNumber(part2))) {
25491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setRegion(part2.string());
25591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else if (part2.length() == 4 && isAlpha(part2)) {
25691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setScript(part2.string());
25791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else if (part2.length() >= 5 && part2.length() <= 8) {
25891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setVariant(part2.string());
25991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else {
26091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         valid = false;
26191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
26291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
26391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (!valid || numTags == 2) {
26491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         return valid;
26591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
26691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
26791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     // At this point, valid == true && numTags > 1.
26891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const String8& part3 = parts[2];
26991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (((part3.length() == 2 && isAlpha(part3)) ||
27091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         (part3.length() == 3 && isNumber(part3))) && script[0]) {
27191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setRegion(part3.string());
27291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else if (part3.length() >= 5 && part3.length() <= 8) {
27391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setVariant(part3.string());
27491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else {
27591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         valid = false;
27691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
27791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
27891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (!valid || numTags == 3) {
27991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         return valid;
28091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
28191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
28291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     const String8& part4 = parts[3];
28391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (part4.length() >= 5 && part4.length() <= 8) {
28491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         setVariant(part4.string());
28591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     } else {
28691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         valid = false;
28791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
28891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
28991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     if (!valid || numTags > 4) {
29091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         return false;
29191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     }
29291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
29391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath     return true;
29491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
29591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
29691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathint AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int startIndex) {
29791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    const int size = parts.size();
29891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    int currentIndex = startIndex;
29991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
30091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    String8 part = parts[currentIndex];
30191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (part[0] == 'b' && part[1] == '+') {
30291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        // This is a "modified" BCP-47 language tag. Same semantics as BCP-47 tags,
30391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        // except that the separator is "+" and not "-".
30491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        Vector<String8> subtags;
30591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        AaptLocaleValue::splitAndLowerCase(part.string(), &subtags, '+');
30691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        subtags.removeItemsAt(0);
30791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        if (subtags.size() == 1) {
30891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setLanguage(subtags[0]);
30991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        } else if (subtags.size() == 2) {
31091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setLanguage(subtags[0]);
31191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
31291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // The second tag can either be a region, a variant or a script.
31391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            switch (subtags[1].size()) {
31491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 2:
31591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 3:
31691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    setRegion(subtags[1]);
31791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    break;
31891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 4:
31991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    setScript(subtags[1]);
32091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    break;
32191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 5:
32291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 6:
32391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 7:
32491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                case 8:
32591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    setVariant(subtags[1]);
32691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    break;
32791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                default:
32891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name %s\n",
32991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                            part.string());
33091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                    return -1;
33191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            }
33291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        } else if (subtags.size() == 3) {
33391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // The language is always the first subtag.
33491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setLanguage(subtags[0]);
33591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
33691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // The second subtag can either be a script or a region code.
33791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // If its size is 4, it's a script code, else it's a region code.
33891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            bool hasRegion = false;
33991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            if (subtags[1].size() == 4) {
34091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                setScript(subtags[1]);
34191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
34291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                setRegion(subtags[1]);
34391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                hasRegion = true;
34491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            } else {
34591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name %s\n", part.string());
34691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                return -1;
34791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            }
34891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
34991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // The third tag can either be a region code (if the second tag was
35091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            // a script), else a variant code.
35191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            if (subtags[2].size() > 4) {
35291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                setVariant(subtags[2]);
35391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            } else {
35491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                setRegion(subtags[2]);
35591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            }
35691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        } else if (subtags.size() == 4) {
35791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setLanguage(subtags[0]);
35891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setScript(subtags[1]);
35991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setRegion(subtags[2]);
36091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setVariant(subtags[3]);
36191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        } else {
36291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name: %s\n", part.string());
36391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            return -1;
36491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        }
36591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
36691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return ++currentIndex;
36791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    } else {
36891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        if ((part.length() == 2 || part.length() == 3) && isAlpha(part)) {
36991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setLanguage(part);
37091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            if (++currentIndex == size) {
37191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                return size;
37291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            }
37391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        } else {
37491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            return currentIndex;
37591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        }
37691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
37791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        part = parts[currentIndex];
37891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        if (part.string()[0] == 'r' && part.length() == 3) {
37991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            setRegion(part.string() + 1);
38091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            if (++currentIndex == size) {
38191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                return size;
38291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            }
38391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        }
38491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
38591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
38691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    return currentIndex;
38791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
38891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
38991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
39091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan KamathString8 AaptLocaleValue::toDirName() const {
39191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    String8 dirName("");
39291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (language[0]) {
39391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += language;
39491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    } else {
39591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return dirName;
39691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
39791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
39891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (script[0]) {
39991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += "-s";
40091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += script;
40191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
40291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
40391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (region[0]) {
40491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += "-r";
40591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += region;
40691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
40791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
40891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (variant[0]) {
40991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += "-v";
41091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        dirName += variant;
41191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
41291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
41391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    return dirName;
41491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
41591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
41691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::initFromResTable(const ResTable_config& config) {
41791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    config.unpackLanguage(language);
41891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    config.unpackRegion(region);
41991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (config.localeScript[0]) {
42091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        memcpy(script, config.localeScript, sizeof(config.localeScript));
42191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
42291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
42391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (config.localeVariant[0]) {
42491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
42591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
42691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
42791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
42891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathvoid AaptLocaleValue::writeTo(ResTable_config* out) const {
42991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    out->packLanguage(language);
43091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    out->packRegion(region);
43191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
43291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (script[0]) {
43391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        memcpy(out->localeScript, script, sizeof(out->localeScript));
43491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
43591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
43691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (variant[0]) {
43791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
43891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    }
43991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath}
44091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
44191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
44291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath/* static */ bool
44391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan KamathAaptGroupEntry::parseFilterNamePart(const String8& part, int* axis, AxisValue* value)
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResTable_config config;
44691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    memset(&config, 0, sizeof(ResTable_config));
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // IMSI - MCC
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMccName(part.string(), &config)) {
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_MCC;
45191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.mcc;
45291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // IMSI - MNC
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMncName(part.string(), &config)) {
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_MNC;
45891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.mnc;
45991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // locale - language
46391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (value->localeValue.initFromFilterString(part)) {
46491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        *axis = AXIS_LOCALE;
46591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // layout direction
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getLayoutDirectionName(part.string(), &config)) {
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_LAYOUTDIR;
47191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR);
47291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // smallest screen dp width
476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getSmallestScreenWidthDpName(part.string(), &config)) {
477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SMALLESTSCREENWIDTHDP;
47891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.smallestScreenWidthDp;
47991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen dp width
483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenWidthDpName(part.string(), &config)) {
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENWIDTHDP;
48591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.screenWidthDp;
48691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen dp height
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenHeightDpName(part.string(), &config)) {
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENHEIGHTDP;
49291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.screenHeightDp;
49391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen layout size
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutSizeName(part.string(), &config)) {
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENLAYOUTSIZE;
49991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
50091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen layout long
504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutLongName(part.string(), &config)) {
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENLAYOUTLONG;
50691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
50791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // orientation
511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getOrientationName(part.string(), &config)) {
512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_ORIENTATION;
51391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.orientation;
51491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode type
518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeTypeName(part.string(), &config)) {
519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_UIMODETYPE;
52091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
52191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode night
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeNightName(part.string(), &config)) {
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_UIMODENIGHT;
52791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
52891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // density
532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getDensityName(part.string(), &config)) {
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_DENSITY;
53491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.density;
53591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // touchscreen
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getTouchscreenName(part.string(), &config)) {
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_TOUCHSCREEN;
54191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.touchscreen;
54291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard hidden
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeysHiddenName(part.string(), &config)) {
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_KEYSHIDDEN;
54891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.inputFlags;
54991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeyboardName(part.string(), &config)) {
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_KEYBOARD;
55591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.keyboard;
55691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation hidden
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavHiddenName(part.string(), &config)) {
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_NAVHIDDEN;
56291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.inputFlags;
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavigationName(part.string(), &config)) {
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_NAVIGATION;
56991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.navigation;
57091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // screen size
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenSizeName(part.string(), &config)) {
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_SCREENSIZE;
57691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.screenSize;
57791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // version
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getVersionName(part.string(), &config)) {
582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *axis = AXIS_VERSION;
58391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        value->intValue = config.version;
58491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return true;
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
58791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    return false;
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
59091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan KamathAxisValue
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis)
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
59391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    AxisValue value;
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    switch (axis) {
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_MCC:
59691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.mcc;
59791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_MNC:
59991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.mnc;
60091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
60191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        case AXIS_LOCALE:
60291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.localeValue.initFromResTable(config);
60391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_LAYOUTDIR:
60591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.screenLayout&ResTable_config::MASK_LAYOUTDIR;
60691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENLAYOUTSIZE:
60891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.screenLayout&ResTable_config::MASK_SCREENSIZE;
60991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_ORIENTATION:
61191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.orientation;
61291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_UIMODETYPE:
61491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
61591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_UIMODENIGHT:
61791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
61891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_DENSITY:
62091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.density;
62191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_TOUCHSCREEN:
62391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.touchscreen;
62491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_KEYSHIDDEN:
62691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.inputFlags;
62791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_KEYBOARD:
62991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.keyboard;
63091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_NAVIGATION:
63291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.navigation;
63391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENSIZE:
63591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.screenSize;
63691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SMALLESTSCREENWIDTHDP:
63891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.smallestScreenWidthDp;
63991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENWIDTHDP:
64191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.screenWidthDp;
64291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_SCREENHEIGHTDP:
64491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.screenHeightDp;
64591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        case AXIS_VERSION:
64791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            value.intValue = config.version;
64891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            break;
649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
65091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
65191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    return value;
652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
655282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::configSameExcept(const ResTable_config& config,
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const ResTable_config& otherConfig, int axis)
657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=AXIS_START; i<=AXIS_END; i++) {
659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (i == axis) {
660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) {
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::initFromDirName(const char* dir, String8* resType)
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mParamsChanged = true;
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<String8> parts;
67591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    AaptLocaleValue::splitAndLowerCase(dir, &parts, '-');
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
67791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    String8 mcc, mnc, layoutsize, layoutlong, orient, den;
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers;
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    AaptLocaleValue locale;
68291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    int numLocaleComponents = 0;
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = parts.size();
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int index = 0;
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 part = parts[index];
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // resource type
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!isValidResourceType(part)) {
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    *resType = part;
693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    index++;
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (index == N) {
696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto success;
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    part = parts[index];
699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // imsi - mcc
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMccName(part.string())) {
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mcc = part;
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not mcc: %s\n", part.string());
711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // imsi - mnc
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getMncName(part.string())) {
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mnc = part;
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
72391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        //printf("not mnc: %s\n", part.string());
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
72691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    index = locale.initFromDirName(parts, index);
72791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (index == -1) {
72891447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        return false;
729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
73091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (index >= N){
73191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath        goto success;
732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    part = parts[index];
735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getLayoutDirectionName(part.string())) {
736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutDir = part;
737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not layout direction: %s\n", part.string());
745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getSmallestScreenWidthDpName(part.string())) {
748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        smallestwidthdp = part;
749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not smallest screen width dp: %s\n", part.string());
757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenWidthDpName(part.string())) {
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        widthdp = part;
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen width dp: %s\n", part.string());
769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenHeightDpName(part.string())) {
772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        heightdp = part;
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen height dp: %s\n", part.string());
781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutSizeName(part.string())) {
784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutsize = part;
785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen layout size: %s\n", part.string());
793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenLayoutLongName(part.string())) {
796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        layoutlong = part;
797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen layout long: %s\n", part.string());
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // orientation
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getOrientationName(part.string())) {
809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        orient = part;
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not orientation: %s\n", part.string());
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode type
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeTypeName(part.string())) {
822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uiModeType = part;
823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not ui mode type: %s\n", part.string());
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ui mode night
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getUiModeNightName(part.string())) {
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        uiModeNight = part;
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not ui mode night: %s\n", part.string());
844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // density
847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getDensityName(part.string())) {
848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        den = part;
849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not density: %s\n", part.string());
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // touchscreen
860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getTouchscreenName(part.string())) {
861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        touch = part;
862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not touchscreen: %s\n", part.string());
870282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard hidden
873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeysHiddenName(part.string())) {
874282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        keysHidden = part;
875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not keysHidden: %s\n", part.string());
883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // keyboard
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getKeyboardName(part.string())) {
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        key = part;
888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not keyboard: %s\n", part.string());
896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // navigation hidden
899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavHiddenName(part.string())) {
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        navHidden = part;
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not navHidden: %s\n", part.string());
909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getNavigationName(part.string())) {
912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        nav = part;
913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not navigation: %s\n", part.string());
921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getScreenSizeName(part.string())) {
924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size = part;
925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not screen size: %s\n", part.string());
933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (getVersionName(part.string())) {
936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        vers = part;
937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        index++;
939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (index == N) {
940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto success;
941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        part = parts[index];
943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("not version: %s\n", part.string());
945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // if there are extra parts, it doesn't match
948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisuccess:
951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->mcc = mcc;
952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->mnc = mnc;
95391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    this->locale = locale;
954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenLayoutSize = layoutsize;
955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenLayoutLong = layoutlong;
956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->smallestScreenWidthDp = smallestwidthdp;
957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenWidthDp = widthdp;
958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenHeightDp = heightdp;
959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->orientation = orient;
960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->uiModeType = uiModeType;
961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->uiModeNight = uiModeNight;
962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->density = den;
963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->touchscreen = touch;
964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->keysHidden = keysHidden;
965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->keyboard = key;
966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->navHidden = navHidden;
967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->navigation = nav;
968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->screenSize = size;
969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->layoutDirection = layoutDir;
970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->version = vers;
971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // what is this anyway?
973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    this->vendor = "";
974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
978282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8
979282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::toString() const
980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 s = this->mcc;
982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
983282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += this->mnc;
984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
98591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    s += locale.toDirName();
986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += layoutDirection;
988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += smallestScreenWidthDp;
990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenWidthDp;
992282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenHeightDp;
994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenLayoutSize;
996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenLayoutLong;
998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += this->orientation;
1000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += uiModeType;
1002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += uiModeNight;
1004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += density;
1006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += touchscreen;
1008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += keysHidden;
1010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += keyboard;
1012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += navHidden;
1014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += navigation;
1016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += screenSize;
1018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += ",";
1019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    s += version;
1020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return s;
1021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1023282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8
1024282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptGroupEntry::toDirName(const String8& resType) const
1025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 s = resType;
1027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->mcc != "") {
1028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += mcc;
1032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->mnc != "") {
1034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += mnc;
1038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
103991447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
104091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    const String8 localeComponent = locale.toDirName();
104191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    if (localeComponent != "") {
104291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         if (s.length() > 0) {
104391447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath             s += "-";
104491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         }
104591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath         s += localeComponent;
1046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
104791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath
1048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->layoutDirection != "") {
1049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += layoutDirection;
1053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->smallestScreenWidthDp != "") {
1055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += smallestScreenWidthDp;
1059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenWidthDp != "") {
1061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenWidthDp;
1065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenHeightDp != "") {
1067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenHeightDp;
1071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenLayoutSize != "") {
1073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenLayoutSize;
1077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenLayoutLong != "") {
1079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenLayoutLong;
1083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->orientation != "") {
1085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1086282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1087282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1088282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += orientation;
1089282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1090282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->uiModeType != "") {
1091282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += uiModeType;
1095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->uiModeNight != "") {
1097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += uiModeNight;
1101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->density != "") {
1103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += density;
1107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->touchscreen != "") {
1109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += touchscreen;
1113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->keysHidden != "") {
1115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += keysHidden;
1119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->keyboard != "") {
1121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += keyboard;
1125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->navHidden != "") {
1127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += navHidden;
1131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->navigation != "") {
1133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += navigation;
1137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->screenSize != "") {
1139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += screenSize;
1143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (this->version != "") {
1145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (s.length() > 0) {
1146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            s += "-";
1147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        s += version;
1149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return s;
1152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getMccName(const char* name,
1155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
1156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = 0;
1159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* c = name;
1162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'm') return false;
1163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
1165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
1167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* val = c;
1170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
1172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
1173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*c != 0) return false;
1175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (c-val != 3) return false;
1176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int d = atoi(val);
1178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (d != 0) {
1179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = d;
1180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getMncName(const char* name,
1187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
1188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->mcc = 0;
1191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* c = name;
1194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'm') return false;
1195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'n') return false;
1197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (tolower(*c) != 'c') return false;
1199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c++;
1200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* val = c;
1202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
1204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
1205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*c != 0) return false;
1207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (c-val == 0 || c-val > 3) return false;
1208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->mnc = atoi(val);
1211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out->mnc == 0) {
1212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->mnc = ACONFIGURATION_MNC_ZERO;
1213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out)
1220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
1224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_ANY;
1225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "ldltr") == 0) {
1227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
1229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_LTR;
1230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "ldrtl") == 0) {
1232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
1234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::LAYOUTDIR_RTL;
1235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenLayoutSizeName(const char* name,
1242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_ANY;
1248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "small") == 0) {
1250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_SMALL;
1253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "normal") == 0) {
1255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_NORMAL;
1258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "large") == 0) {
1260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_LARGE;
1263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "xlarge") == 0) {
1265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENSIZE_XLARGE;
1268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenLayoutLongName(const char* name,
1275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_ANY;
1281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "long") == 0) {
1283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_YES;
1286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notlong") == 0) {
1288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->screenLayout =
1289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::SCREENLONG_NO;
1291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getOrientationName(const char* name,
1298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_ANY;
1302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "port") == 0) {
1304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_PORT;
1305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "land") == 0) {
1307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_LAND;
1308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "square") == 0) {
1310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->orientation = out->ORIENTATION_SQUARE;
1311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getUiModeTypeName(const char* name,
1318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_TYPE_ANY;
1324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "desk") == 0) {
1326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_DESK;
1329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "car") == 0) {
1331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_CAR;
1334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "television") == 0) {
1336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_TELEVISION;
1339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "appliance") == 0) {
1341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
1344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getUiModeNightName(const char* name,
1351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                          ResTable_config* out)
1352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_NIGHT_ANY;
1357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "night") == 0) {
1359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->uiMode =
1360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                | ResTable_config::UI_MODE_NIGHT_YES;
1362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notnight") == 0) {
1364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      if (out) out->uiMode =
1365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
1366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              | ResTable_config::UI_MODE_NIGHT_NO;
1367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getDensityName(const char* name,
1374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    ResTable_config* out)
1375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
1378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "nodpi") == 0) {
1382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_NONE;
1383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "ldpi") == 0) {
1387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_LOW;
1388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "mdpi") == 0) {
1392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
1393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "tvdpi") == 0) {
1397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_TV;
1398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "hdpi") == 0) {
1402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_HIGH;
1403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xhdpi") == 0) {
1407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XHIGH;
1408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xxhdpi") == 0) {
1412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
1413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, "xxxhdpi") == 0) {
1417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
1418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char* c = (char*)name;
1422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*c >= '0' && *c <= '9') {
1423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        c++;
1424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // check that we have 'dpi' after the last digit.
1427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (toupper(c[0]) != 'D' ||
1428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            toupper(c[1]) != 'P' ||
1429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            toupper(c[2]) != 'I' ||
1430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            c[3] != 0) {
1431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // temporarily replace the first letter with \0 to
1435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // use atoi.
1436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char tmp = c[0];
1437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c[0] = '\0';
1438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int d = atoi(name);
1440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    c[0] = tmp;
1441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (d != 0) {
1443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->density = d;
1444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getTouchscreenName(const char* name,
1451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
1455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "notouch") == 0) {
1457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
1458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "stylus") == 0) {
1460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
1461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "finger") == 0) {
1463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
1464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getKeysHiddenName(const char* name,
1471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t mask = 0;
1474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t value = 0;
1475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_ANY;
1478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keysexposed") == 0) {
1479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_NO;
1481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keyshidden") == 0) {
1482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_YES;
1484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "keyssoft") == 0) {
1485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_KEYSHIDDEN;
1486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::KEYSHIDDEN_SOFT;
1487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mask != 0) {
1490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
1491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getKeyboardName(const char* name,
1498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        ResTable_config* out)
1499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_ANY;
1502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "nokeys") == 0) {
1504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
1505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "qwerty") == 0) {
1507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_QWERTY;
1508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "12key") == 0) {
1510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->keyboard = out->KEYBOARD_12KEY;
1511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getNavHiddenName(const char* name,
1518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                       ResTable_config* out)
1519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t mask = 0;
1521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint8_t value = 0;
1522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_ANY;
1525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "navexposed") == 0) {
1526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_NO;
1528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "navhidden") == 0) {
1529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mask = ResTable_config::MASK_NAVHIDDEN;
1530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        value = ResTable_config::NAVHIDDEN_YES;
1531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mask != 0) {
1534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
1535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getNavigationName(const char* name,
1542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                     ResTable_config* out)
1543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_ANY;
1546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "nonav") == 0) {
1548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_NONAV;
1549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "dpad") == 0) {
1551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_DPAD;
1552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "trackball") == 0) {
1554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
1555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if (strcmp(name, "wheel") == 0) {
1557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) out->navigation = out->NAVIGATION_WHEEL;
1558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
1562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
1565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenWidth = out->SCREENWIDTH_ANY;
1569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenHeight = out->SCREENHEIGHT_ANY;
1570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || *x != 'x') return false;
1577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    x++;
1579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* y = x;
1581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*y >= '0' && *y <= '9') y++;
1582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (y == name || *y != 0) return false;
1583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 yName(x, y-x);
1584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint16_t w = (uint16_t)atoi(xName.string());
1586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    uint16_t h = (uint16_t)atoi(yName.string());
1587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (w < h) {
1588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenWidth = w;
1593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenHeight = h;
1594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
1600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
1604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 's') return false;
1609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'w') return false;
1611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
1619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
1625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenWidthDp = out->SCREENWIDTH_ANY;
1629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'w') return false;
1634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenWidthDp = (uint16_t)atoi(xName.string());
1642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
1648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->screenHeightDp = out->SCREENWIDTH_ANY;
1652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'h') return false;
1657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* x = name;
1659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*x >= '0' && *x <= '9') x++;
1660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 xName(name, x-name);
1662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->screenHeightDp = (uint16_t)atoi(xName.string());
1665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
1671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (strcmp(name, kWildcardName) == 0) {
1673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (out) {
1674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->sdkVersion = out->SDKVERSION_ANY;
1675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out->minorVersion = out->MINORVERSION_ANY;
1676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
1678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (*name != 'v') {
1681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    name++;
1685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* s = name;
1686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*s >= '0' && *s <= '9') s++;
1687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (s == name || *s != 0) return false;
1688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 sdkName(name, s-name);
1689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (out) {
1691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->sdkVersion = (uint16_t)atoi(sdkName.string());
1692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out->minorVersion = 0;
1693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
1696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint AaptGroupEntry::compare(const AaptGroupEntry& o) const
1699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int v = mcc.compare(o.mcc);
1701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = mnc.compare(o.mnc);
1702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = locale.compare(o.locale);
1703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = layoutDirection.compare(o.layoutDirection);
1704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = vendor.compare(o.vendor);
1705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
1706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
1707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
1708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
1709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
1710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = orientation.compare(o.orientation);
1711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = uiModeType.compare(o.uiModeType);
1712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = uiModeNight.compare(o.uiModeNight);
1713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = density.compare(o.density);
1714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = touchscreen.compare(o.touchscreen);
1715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = keysHidden.compare(o.keysHidden);
1716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = keyboard.compare(o.keyboard);
1717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = navHidden.compare(o.navHidden);
1718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = navigation.compare(o.navigation);
1719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = screenSize.compare(o.screenSize);
1720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (v == 0) v = version.compare(o.version);
1721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return v;
1722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
172491447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamathconst ResTable_config AaptGroupEntry::toParams() const
1725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mParamsChanged) {
1727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParams;
1728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mParamsChanged = false;
173191447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    ResTable_config& params = mParams;
173291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    memset(&params, 0, sizeof(ResTable_config));
1733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getMccName(mcc.string(), &params);
1734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getMncName(mnc.string(), &params);
173591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath    locale.writeTo(&params);
1736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getLayoutDirectionName(layoutDirection.string(), &params);
1737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
1738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenWidthDpName(screenWidthDp.string(), &params);
1739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenHeightDpName(screenHeightDp.string(), &params);
1740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
1741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenLayoutLongName(screenLayoutLong.string(), &params);
1742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getOrientationName(orientation.string(), &params);
1743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getUiModeTypeName(uiModeType.string(), &params);
1744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getUiModeNightName(uiModeNight.string(), &params);
1745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getDensityName(density.string(), &params);
1746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getTouchscreenName(touchscreen.string(), &params);
1747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getKeysHiddenName(keysHidden.string(), &params);
1748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getKeyboardName(keyboard.string(), &params);
1749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getNavHiddenName(navHidden.string(), &params);
1750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getNavigationName(navigation.string(), &params);
1751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getScreenSizeName(screenSize.string(), &params);
1752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    getVersionName(version.string(), &params);
1753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Fix up version number based on specified parameters.
1755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int minSdk = 0;
1756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
1757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
1758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
1759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_HONEYCOMB_MR2;
1760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
1761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::UI_MODE_TYPE_ANY
1762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
1763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::UI_MODE_NIGHT_ANY) {
1764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_FROYO;
1765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
1766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::SCREENSIZE_ANY
1767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ||  (params.screenLayout&ResTable_config::MASK_SCREENLONG)
1768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                != ResTable_config::SCREENLONG_ANY
1769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            || params.density != ResTable_config::DENSITY_DEFAULT) {
1770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        minSdk = SDK_DONUT;
1771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (minSdk > params.sdkVersion) {
1774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        params.sdkVersion = minSdk;
1775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return params;
1778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::editData(size_t size)
1785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (size <= mBufferSize) {
1787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mDataSize = size;
1788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mData;
1789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t allocSize = (size*3)/2;
1791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* buf = realloc(mData, allocSize);
1792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (buf == NULL) {
1793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NULL;
1794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mData = buf;
1796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDataSize = size;
1797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mBufferSize = allocSize;
1798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return buf;
1799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1801de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinskivoid* AaptFile::editDataInRange(size_t offset, size_t size)
1802de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski{
1803de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski    return (void*)(((uint8_t*) editData(offset + size)) + offset);
1804de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski}
1805de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski
1806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::editData(size_t* outSize)
1807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (outSize) {
1809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *outSize = mDataSize;
1810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mData;
1812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid* AaptFile::padData(size_t wordSize)
1815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t extra = mDataSize%wordSize;
1817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (extra == 0) {
1818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mData;
1819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t initial = mDataSize;
1822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* data = editData(initial+(wordSize-extra));
1823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (data != NULL) {
1824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memset(((uint8_t*)data) + initial, 0, wordSize-extra);
1825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return data;
1827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptFile::writeData(const void* data, size_t size)
1830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t end = mDataSize;
1832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t total = size + end;
1833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* buf = editData(total);
1834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (buf == NULL) {
1835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return UNKNOWN_ERROR;
1836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    memcpy(((char*)buf)+end, data, size);
1838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptFile::clearData()
1842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mData != NULL) free(mData);
1844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mData = NULL;
1845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDataSize = 0;
1846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mBufferSize = 0;
1847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1849282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptFile::getPrintableSource() const
1850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (hasData()) {
1852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 name(mGroupEntry.toDirName(String8()));
1853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        name.appendPath(mPath);
1854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        name.append(" #generated");
1855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return name;
1856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mSourceFile;
1858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
186409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinskistatus_t AaptGroup::addFile(const sp<AaptFile>& file, const bool overwriteDuplicate)
1865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
186609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    ssize_t index = mFiles.indexOfKey(file->getGroupEntry());
186709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    if (index >= 0 && overwriteDuplicate) {
186809384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        fprintf(stderr, "warning: overwriting '%s' with '%s'\n",
186909384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                mFiles[index]->getSourceFile().string(),
187009384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                file->getSourceFile().string());
187109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        removeFile(index);
187209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        index = -1;
187309384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    }
187409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski
187509384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    if (index < 0) {
1876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        file->mPath = mPath;
1877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mFiles.add(file->getGroupEntry(), file);
1878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NO_ERROR;
1879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
1882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n",
1883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file->getSourceFile().string(),
1884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file->getGroupEntry().toDirName(String8()).string(),
1885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLeaf.string(), mPath.string());
1886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
1887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.",
1889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                               getPrintableSource().string());
1890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return UNKNOWN_ERROR;
1891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptGroup::removeFile(size_t index)
1894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski	mFiles.removeItemsAt(index);
1896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptGroup::print(const String8& prefix) const
1899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("%s%s\n", prefix.string(), getPath().string());
1901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N=mFiles.size();
1902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
1903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<N; i++) {
1904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> file = mFiles.valueAt(i);
1905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const AaptGroupEntry& e = file->getGroupEntry();
1906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (file->hasData()) {
1907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("%s  Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(),
1908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    (int)file->getSize());
1909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
1910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("%s  Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(),
1911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    file->getPrintableSource().string());
1912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("%s  File Group Entry: %s\n", prefix.string(),
1914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //        file->getGroupEntry().toDirName(String8()).string());
1915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1918282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptGroup::getPrintableSource() const
1919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.size() > 0) {
1921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Arbitrarily pull the first source file out of the list.
1922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mFiles.valueAt(0)->getPrintableSource();
1923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Should never hit this case, but to be safe...
1926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return getPath();
1927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
1933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file)
1935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.indexOfKey(name) >= 0) {
1937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ALREADY_EXISTS;
1938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mFiles.add(name, file);
1940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir)
1944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mDirs.indexOfKey(name) >= 0) {
1946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ALREADY_EXISTS;
1947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDirs.add(name, dir);
1949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
1950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptDir> AaptDir::makeDir(const String8& path)
1953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 name;
1955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 remain = path;
1956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> subdir = this;
1958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (name = remain.walkPath(&remain), remain != "") {
1959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        subdir = subdir->makeDir(name);
1960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t i = subdir->mDirs.indexOfKey(name);
1963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (i >= 0) {
1964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return subdir->mDirs.valueAt(i);
1965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name));
1967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    subdir->mDirs.add(name, dir);
1968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return dir;
1969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::removeFile(const String8& name)
1972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mFiles.removeItem(name);
1974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::removeDir(const String8& name)
1977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mDirs.removeItem(name);
1979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
198109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinskistatus_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file,
198209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        const bool overwrite)
1983282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> group;
1985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.indexOfKey(leafName) >= 0) {
1986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        group = mFiles.valueFor(leafName);
1987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
1988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        group = new AaptGroup(leafName, mPath.appendPathCopy(leafName));
1989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mFiles.add(leafName, group);
1990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
199209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    return group->addFile(file, overwrite);
1993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
1996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            const AaptGroupEntry& kind, const String8& resType,
199709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                            sp<FilePathStore>& fullResPaths, const bool overwrite)
1998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
1999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<String8> fileNames;
2000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
2001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        DIR* dir = NULL;
2002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        dir = opendir(srcDir.string());
2004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir == NULL) {
2005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
2006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /*
2010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * Slurp the filenames out of the directory.
2011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         */
2012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        while (1) {
2013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            struct dirent* entry;
2014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entry = readdir(dir);
2016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (entry == NULL)
2017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                break;
2018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (isHidden(srcDir.string(), entry->d_name))
2020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                continue;
2021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String8 name(entry->d_name);
2023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fileNames.add(name);
2024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Add fully qualified path for dependency purposes
2025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // if we're collecting them
2026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (fullResPaths != NULL) {
2027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fullResPaths->add(srcDir.appendPathCopy(name));
2028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        closedir(dir);
2031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t count = 0;
2034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Stash away the files and recursively descend into subdirectories.
2037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N = fileNames.size();
2039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
2040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < N; i++) {
2041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 pathName(srcDir);
2042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type;
2043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        pathName.appendPath(fileNames[i].string());
2045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        type = getFileType(pathName.string());
2046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeDirectory) {
2047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> subdir;
2048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            bool notAdded = false;
2049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mDirs.indexOfKey(fileNames[i]) >= 0) {
2050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                subdir = mDirs.valueFor(fileNames[i]);
2051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
2052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i]));
2053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                notAdded = true;
2054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
205609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                                                resType, fullResPaths, overwrite);
2057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res < NO_ERROR) {
2058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return res;
2059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res > 0 && notAdded) {
2061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mDirs.add(fileNames[i], subdir);
2062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count += res;
2064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (type == kFileTypeRegular) {
2065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptFile> file = new AaptFile(pathName, kind, resType);
206609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            status_t err = addLeafFile(fileNames[i], file, overwrite);
2067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (err != NO_ERROR) {
2068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return err;
2069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count++;
2072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose())
2075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf("   (ignoring non-file/dir '%s')\n", pathName.string());
2076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
2080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptDir::validate() const
2083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NF = mFiles.size();
2085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND = mDirs.size();
2086282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
2087282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < NF; i++) {
2088282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) {
2089282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
2090282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    "Invalid filename.  Unable to add.");
2091282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t j;
2095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = i+1; j < NF; j++) {
2096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
2097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mFiles.valueAt(j)->getLeaf().string()) == 0) {
2098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
2099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "File is case-insensitive equivalent to: %s",
2100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mFiles.valueAt(j)->getPrintableSource().string());
2101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // TODO: if ".gz", check for non-.gz; if non-, check for ".gz"
2105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // (this is mostly caught by the "marked" stuff, below)
2106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = 0; j < ND; j++) {
2109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
2110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
2111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
2112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "File conflicts with dir from: %s",
2113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mDirs.valueAt(j)->getPrintableSource().string());
2114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i = 0; i < ND; i++) {
2120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) {
2121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
2122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    "Invalid directory name, unable to add.");
2123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t j;
2127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (j = i+1; j < ND; j++) {
2128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(),
2129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
2130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
2131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        "Directory is case-insensitive equivalent to: %s",
2132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        mDirs.valueAt(j)->getPrintableSource().string());
2133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = mDirs.valueAt(i)->validate();
2138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
2139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return err;
2140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptDir::print(const String8& prefix) const
2147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND=getDirs().size();
2149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t i;
2150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<ND; i++) {
2151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        getDirs().valueAt(i)->print(prefix);
2152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NF=getFiles().size();
2155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (i=0; i<NF; i++) {
2156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        getFiles().valueAt(i)->print(prefix);
2157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2160282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiString8 AaptDir::getPrintableSource() const
2161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mFiles.size() > 0) {
2163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Arbitrarily pull the first file out of the list as the source dir.
2164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mFiles.valueAt(0)->getPrintableSource().getPathDir();
2165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mDirs.size() > 0) {
2167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Or arbitrarily pull the first dir out of the list as the source dir.
2168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mDirs.valueAt(0)->getPrintableSource().getPathDir();
2169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Should never hit this case, but to be safe...
2172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mPath;
2173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
2181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = NO_ERROR;
2183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N = javaSymbols->mSymbols.size();
2184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = javaSymbols->mSymbols.keyAt(i);
2186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
2187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mSymbols.indexOfKey(name);
2188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
2189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
2190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = UNKNOWN_ERROR;
2191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
2194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //        i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
2195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
2196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    N = javaSymbols->mNestedSymbols.size();
2199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
2201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
2202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mNestedSymbols.indexOfKey(name);
2203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
2204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos pos;
2205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pos.error("Java symbol dir %s not defined\n", name.string());
2206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = UNKNOWN_ERROR;
2207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** applying java symbols in dir %s\n", name.string());
2210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
2211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (myerr != NO_ERROR) {
2212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = myerr;
2213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return err;
2217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// =========================================================================
2222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2223282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptAssets::AaptAssets()
2224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    : AaptDir(String8(), String8()),
222591447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath      mHavePrivateSymbols(false),
222691447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath      mChanged(false), mHaveIncludedAssets(false),
222791447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath      mRes(NULL)
2228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const {
2232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (mChanged) {
2233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mGroupEntries;
2235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file)
2238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mChanged = true;
2240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return AaptDir::addFile(name, file);
2241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptFile> AaptAssets::addFile(
2244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& filePath, const AaptGroupEntry& entry,
2245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& srcDir, sp<AaptGroup>* outGroup,
2246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& resType)
2247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> dir = this;
2249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> group;
2250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptFile> file;
2251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 root, remain(filePath), partialPath;
2252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (remain.length() > 0) {
2253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        root = remain.walkPath(&remain);
2254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        partialPath.appendPath(root);
2255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8 rootStr(root);
2257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (remain.length() == 0) {
2259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t i = dir->getFiles().indexOfKey(rootStr);
2260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (i >= 0) {
2261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                group = dir->getFiles().valueAt(i);
2262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
2263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                group = new AaptGroup(rootStr, filePath);
2264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                status_t res = dir->addFile(rootStr, group);
2265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (res != NO_ERROR) {
2266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return NULL;
2267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType);
2270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            status_t res = group->addFile(file);
2271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res != NO_ERROR) {
2272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return NULL;
2273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
2275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t i = dir->getDirs().indexOfKey(rootStr);
2278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (i >= 0) {
2279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                dir = dir->getDirs().valueAt(i);
2280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
2281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                sp<AaptDir> subdir = new AaptDir(rootStr, partialPath);
2282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                status_t res = dir->addDir(rootStr, subdir);
2283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (res != NO_ERROR) {
2284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return NULL;
2285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                dir = subdir;
2287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    mGroupEntries.add(entry);
2292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (outGroup) *outGroup = group;
2293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return file;
2294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptAssets::addResource(const String8& leafName, const String8& path,
2297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                const sp<AaptFile>& file, const String8& resType)
2298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> res = AaptDir::makeDir(kResString);
2300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 dirname = file->getGroupEntry().toDirName(resType);
2301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptDir> subdir = res->makeDir(dirname);
2302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptGroup> grr = new AaptGroup(leafName, path);
2303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    grr->addFile(file);
2304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    subdir->addFile(leafName, grr);
2306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpFromArgs(Bundle* bundle)
2310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int count;
2312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int totalCount = 0;
2313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FileType type;
2314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
2315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t dirCount =resDirs.size();
2316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptAssets> current = this;
2317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = bundle->getFileSpecCount();
2319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a package manifest was specified, include that first.
2322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (bundle->getAndroidManifestFile() != NULL) {
2324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // place at root of zip.
2325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 srcFile(bundle->getAndroidManifestFile());
2326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(),
2327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                NULL, String8());
2328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount++;
2329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a directory of custom assets was supplied, slurp 'em up.
2333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
233409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    const Vector<const char*>& assetDirs = bundle->getAssetSourceDirs();
233509384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    const int AN = assetDirs.size();
233609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    for (int i = 0; i < AN; i++) {
233709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        FileType type = getFileType(assetDirs[i]);
2338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeNonexistent) {
233909384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDirs[i]);
2340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type != kFileTypeDirectory) {
234309384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDirs[i]);
2344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
234709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        String8 assetRoot(assetDirs[i]);
2348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
2349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry group;
2350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
235109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                                            String8(), mFullAssetPaths, true);
2352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count < 0) {
2353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            totalCount = count;
2354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count > 0) {
2357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGroupEntries.add(group);
2358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount += count;
2360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
236109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        if (bundle->getVerbose()) {
2362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Found %d custom asset file%s in %s\n",
236309384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                   count, (count==1) ? "" : "s", assetDirs[i]);
236409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        }
2365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If a directory of resource-specific assets was supplied, slurp 'em up.
2369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<dirCount; i++) {
2371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char *res = resDirs[i];
2372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (res) {
2373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            type = getFileType(res);
2374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type == kFileTypeNonexistent) {
2375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
2376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (type == kFileTypeDirectory) {
2379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (i>0) {
2380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    sp<AaptAssets> nextOverlay = new AaptAssets();
2381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current->setOverlay(nextOverlay);
2382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current = nextOverlay;
2383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    current->setFullResPaths(mFullResPaths);
2384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count = current->slurpResourceTree(bundle, String8(res));
23869ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                if (i > 0 && count > 0) {
23879ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                  count = current->filter(bundle);
23889ab9b93eae8b2fc747d6101cf0e4c19b2218715fBryan Mawhinney                }
2389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (count < 0) {
2391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    totalCount = count;
2392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    goto bail;
2393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                totalCount += count;
2395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            else {
2397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
2398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Now do any additional raw files.
2405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int arg=0; arg<N; arg++) {
2407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* assetDir = bundle->getFileSpecEntry(arg);
2408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type = getFileType(assetDir);
2410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeNonexistent) {
2411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir);
2412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type != kFileTypeDirectory) {
2415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
2416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 assetRoot(assetDir);
2420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getVerbose())
2422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Processing raw dir '%s'\n", (const char*) assetDir);
2423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        /*
2425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * Do a recursive traversal of subdir tree.  We don't make any
2426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * guarantees about ordering, so we're okay with an inorder search
2427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         * using whatever order the OS happens to hand back to us.
2428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski         */
2429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
2430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (count < 0) {
2431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            /* failure; report error and remove archive */
2432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            totalCount = count;
2433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount += count;
2436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getVerbose())
2438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Found %d asset file%s in %s\n",
2439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                   count, (count==1) ? "" : "s", assetDir);
2440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    count = validate();
2443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (count != NO_ERROR) {
2444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount = count;
2445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto bail;
2446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    count = filter(bundle);
2449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (count != NO_ERROR) {
2450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        totalCount = count;
2451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        goto bail;
2452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return totalCount;
2456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
2459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const AaptGroupEntry& kind,
2460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    const String8& resType,
2461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    sp<FilePathStore>& fullResPaths)
2462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
2464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (res > 0) {
2465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mGroupEntries.add(kind);
2466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return res;
2469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
2472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ssize_t err = 0;
2474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DIR* dir = opendir(srcDir.string());
2476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (dir == NULL) {
2477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
2478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return UNKNOWN_ERROR;
2479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t count = 0;
2482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
2484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Run through the directory, looking for dirs that match the
2485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * expected pattern.
2486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
2487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (1) {
2488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        struct dirent* entry = readdir(dir);
2489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entry == NULL) {
2490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break;
2491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (isHidden(srcDir.string(), entry->d_name)) {
2494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 subdirName(srcDir);
2498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        subdirName.appendPath(entry->d_name);
2499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry group;
2501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 resType;
2502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        bool b = group.initFromDirName(entry->d_name, &resType);
2503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!b) {
2504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(),
2505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    entry->d_name);
2506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            err = -1;
2507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) {
2511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int maxResInt = atoi(bundle->getMaxResVersion());
2512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            const char *verString = group.getVersionString().string();
2513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int dirVersionInt = atoi(verString + 1); // skip 'v' in version name
2514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (dirVersionInt > maxResInt) {
2515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name);
2516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski              continue;
2517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FileType type = getFileType(subdirName.string());
2521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (type == kFileTypeDirectory) {
2523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> dir = makeDir(resType);
2524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
2525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                resType, mFullResPaths);
2526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res < 0) {
2527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count = res;
2528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                goto bail;
2529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (res > 0) {
2531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mGroupEntries.add(group);
2532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                count += res;
2533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Only add this directory if we don't already have a resource dir
2536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // for the current type.  This ensures that we only add the dir once
2537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // for all configs.
2538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptDir> rdir = resDir(resType);
2539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (rdir == NULL) {
2540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mResDirs.add(dir);
2541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose()) {
2544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "   (ignoring file '%s')\n", subdirName.string());
2545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    closedir(dir);
2551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    dir = NULL;
2552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != 0) {
2554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
2557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskissize_t
2560282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiAaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
2561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int count = 0;
2563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SortedVector<AaptGroupEntry> entries;
2564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipFile* zip = new ZipFile;
2566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = zip->open(filename, ZipFile::kOpenReadOnly);
2567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "error opening zip file %s\n", filename);
2569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count = err;
2570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        delete zip;
2571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
2572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const int N = zip->getNumEntries();
2575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (int i=0; i<N; i++) {
2576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ZipEntry* entry = zip->getEntryByIndex(i);
2577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entry->getDeleted()) {
2578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 entryName(entry->getFileName());
2582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 dirName = entryName.getPathDir();
2584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName);
2585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 resType;
2587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AaptGroupEntry kind;
2588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 remain;
2590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entryName.walkPath(&remain) == kResourceDir) {
2591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // these are the resources, pull their type out of the directory name
2592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kind.initFromDirName(remain.walkPath().string(), &resType);
2593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
2594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // these are untyped and don't have an AaptGroupEntry
2595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entries.indexOf(kind) < 0) {
2597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            entries.add(kind);
2598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGroupEntries.add(kind);
2599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // use the one from the zip file if they both exist.
2602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        dir->removeFile(entryName.getPathLeaf());
2603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sp<AaptFile> file = new AaptFile(entryName, kind, resType);
2605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = dir->addLeafFile(entryName.getPathLeaf(), file);
2606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
2607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string());
2608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            count = err;
2609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            goto bail;
2610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        file->setCompressionMethod(entry->getCompressionMethod());
2612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
2614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (entryName == "AndroidManifest.xml") {
2615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("AndroidManifest.xml\n");
2616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("\n\nfile: %s\n", entryName.string());
2618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
2619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t len = entry->getUncompressedLen();
2621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void* data = zip->uncompress(entry);
2622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void* buf = file->editData(len);
2623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memcpy(buf, data, len);
2624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if 0
2626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const int OFF = 0;
2627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const unsigned char* p = (unsigned char*)data;
2628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const unsigned char* end = p+len;
2629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        p += OFF;
2630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int i=0; i<32 && p < end; i++) {
2631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("0x%03x ", i*0x10 + OFF);
2632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int j=0; j<0x10 && p < end; j++) {
2633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf(" %02x", *p);
2634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                p++;
2635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("\n");
2637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
2639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(data);
2641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        count++;
2643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibail:
2646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    delete zip;
2647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return count;
2648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::filter(Bundle* bundle)
2651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResourceFilter reqFilter;
2653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t err = reqFilter.parse(bundle->getConfigurations());
2654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ResourceFilter prefFilter;
2659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    err = prefFilter.parse(bundle->getPreferredConfigurations());
2660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (err != NO_ERROR) {
2661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return err;
2662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (reqFilter.isEmpty() && prefFilter.isEmpty()) {
2665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NO_ERROR;
2666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (bundle->getVerbose()) {
2669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!reqFilter.isEmpty()) {
2670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Applying required filter: %s\n",
2671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bundle->getConfigurations());
2672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!prefFilter.isEmpty()) {
2674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printf("Applying preferred filter: %s\n",
2675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    bundle->getPreferredConfigurations());
2676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t ND = resdirs.size();
2681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<ND; i++) {
2682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& dir = resdirs.itemAt(i);
2683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir->getLeaf() == kValuesDir) {
2684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // The "value" dir is special since a single file defines
2685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // multiple resources, so we can not do filtering on the
2686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // files themselves.
2687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (dir->getLeaf() == kMipmapDir) {
2690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // We also skip the "mipmap" directory, since the point of this
2691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // is to include all densities without stripping.  If you put
2692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // other configurations in here as well they won't be stripped
2693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // either...  So don't do that.  Seriously.  What is wrong with you?
2694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            continue;
2695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const size_t NG = dir->getFiles().size();
2698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (size_t j=0; j<NG; j++) {
2699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            sp<AaptGroup> grp = dir->getFiles().valueAt(j);
2700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // First remove any configurations we know we don't need.
2702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (size_t k=0; k<grp->getFiles().size(); k++) {
2703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                sp<AaptFile> file = grp->getFiles().valueAt(k);
2704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (k == 0 && grp->getFiles().size() == 1) {
2705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // If this is the only file left, we need to keep it.
2706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // Otherwise the resource IDs we are using will be inconsistent
2707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // with what we get when not stripping.  Sucky, but at least
2708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // for now we can rely on the back-end doing another filtering
2709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // pass to take this out and leave us with this resource name
2710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // containing no entries.
2711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
2712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (file->getPath().getPathExtension() == ".xml") {
2714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // We can't remove .xml files at this point, because when
2715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // we parse them they may add identifier resources, so
2716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // removing them can cause our resource identifiers to
2717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // become inconsistent.
2718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
2719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                const ResTable_config& config(file->getGroupEntry().toParams());
2721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (!reqFilter.match(config)) {
2722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (bundle->getVerbose()) {
2723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        printf("Pruning unneeded resource: %s\n",
2724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                file->getPrintableSource().string());
2725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    grp->removeFile(k);
2727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    k--;
2728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Quick check: no preferred filters, nothing more to do.
2732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (prefFilter.isEmpty()) {
2733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                continue;
2734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27368cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // Get the preferred density if there is one. We do not match exactly for density.
27378cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we
27388cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            // pick xhdpi.
27398cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            uint32_t preferredDensity = 0;
274091447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath            const SortedVector<AxisValue>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY);
27418cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            if (preferredConfigs != NULL && preferredConfigs->size() > 0) {
274291447d88f2bdf9c2bf8d1a53570efef6172fba74Narayan Kamath                preferredDensity = (*preferredConfigs)[0].intValue;
27438cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski            }
27448cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
2745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // Now deal with preferred configurations.
2746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int axis=AXIS_START; axis<=AXIS_END; axis++) {
2747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                for (size_t k=0; k<grp->getFiles().size(); k++) {
2748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    sp<AaptFile> file = grp->getFiles().valueAt(k);
2749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (k == 0 && grp->getFiles().size() == 1) {
2750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // If this is the only file left, we need to keep it.
2751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // Otherwise the resource IDs we are using will be inconsistent
2752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // with what we get when not stripping.  Sucky, but at least
2753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // for now we can rely on the back-end doing another filtering
2754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // pass to take this out and leave us with this resource name
2755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // containing no entries.
2756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        continue;
2757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (file->getPath().getPathExtension() == ".xml") {
2759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // We can't remove .xml files at this point, because when
2760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // we parse them they may add identifier resources, so
2761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // removing them can cause our resource identifiers to
2762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // become inconsistent.
2763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        continue;
2764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    const ResTable_config& config(file->getGroupEntry().toParams());
2766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (!prefFilter.match(axis, config)) {
2767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // This is a resource we would prefer not to have.  Check
2768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // to see if have a similar variation that we would like
2769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // to have and, if so, we can drop it.
27708cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
27718cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        uint32_t bestDensity = config.density;
27728cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
2773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        for (size_t m=0; m<grp->getFiles().size(); m++) {
2774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            if (m == k) continue;
2775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            sp<AaptFile> mfile = grp->getFiles().valueAt(m);
2776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            const ResTable_config& mconfig(mfile->getGroupEntry().toParams());
2777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) {
27788cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                if (axis == AXIS_DENSITY && preferredDensity > 0) {
27798cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    // See if there is a better density resource
27808cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    if (mconfig.density < bestDensity &&
27818cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            mconfig.density > preferredDensity &&
27828cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            bestDensity > preferredDensity) {
27838cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // This density is between our best density and
27848cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // the preferred density, therefore it is better.
27858cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        bestDensity = mconfig.density;
27868cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    } else if (mconfig.density > bestDensity &&
27878cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                            bestDensity < preferredDensity) {
27888cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // This density is better than our best density and
27898cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // our best density was smaller than our preferred
27908cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        // density, so it is better.
27918cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        bestDensity = mconfig.density;
27928cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                    }
27938cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                } else if (prefFilter.match(axis, mconfig)) {
2794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    if (bundle->getVerbose()) {
2795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        printf("Pruning unneeded resource: %s\n",
2796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                file->getPrintableSource().string());
2797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    }
2798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    grp->removeFile(k);
2799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    k--;
2800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    break;
2801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                }
2802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            }
2803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
28048cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski
28058cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        if (axis == AXIS_DENSITY && preferredDensity > 0 &&
28068cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                bestDensity != config.density) {
28078cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            if (bundle->getVerbose()) {
28088cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                printf("Pruning unneeded resource: %s\n",
28098cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                                        file->getPrintableSource().string());
28108cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            }
28118cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            grp->removeFile(k);
28128cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                            k--;
28138cf61845187e301dfc4f64b42921977d38766a34Adam Lesinski                        }
2814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
2815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
2816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
2824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptSymbols> sym = mSymbols.valueFor(name);
2826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym == NULL) {
2827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sym = new AaptSymbols();
2828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSymbols.add(name, sym);
2829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return sym;
2831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
2834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
2836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym == NULL) {
2837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        sym = new AaptSymbols();
2838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mJavaSymbols.add(name, sym);
2839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return sym;
2841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::applyJavaSymbols()
2844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    size_t N = mJavaSymbols.size();
2846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const String8& name = mJavaSymbols.keyAt(i);
2848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
2849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ssize_t pos = mSymbols.indexOfKey(name);
2850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (pos < 0) {
2851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            SourcePos pos;
2852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            pos.error("Java symbol dir %s not defined\n", name.string());
2853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return UNKNOWN_ERROR;
2854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //printf("**** applying java symbols in dir %s\n", name.string());
2856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
2857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (err != NO_ERROR) {
2858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return err;
2859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
2866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
2867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //        sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
2868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //        sym.isJavaSymbol ? 1 : 0);
2869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mHavePrivateSymbols) return true;
2870282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (sym.isPublic) return true;
2871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (includePrivate && sym.isJavaSymbol) return true;
2872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return false;
2873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2874282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::buildIncludedResources(Bundle* bundle)
2876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (!mHaveIncludedAssets) {
2878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Add in all includes.
2879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const Vector<const char*>& incl = bundle->getPackageIncludes();
2880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const size_t N=incl.size();
2881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (size_t i=0; i<N; i++) {
2882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (bundle->getVerbose())
2883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                printf("Including resources from package: %s\n", incl[i]);
2884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) {
2885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                fprintf(stderr, "ERROR: Asset package include '%s' not found.\n",
2886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        incl[i]);
2887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return UNKNOWN_ERROR;
2888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
2889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mHaveIncludedAssets = true;
2891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NO_ERROR;
2894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatus_t AaptAssets::addIncludedResources(const sp<AaptFile>& file)
2897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const ResTable& res = getIncludedResources();
2899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // XXX dirty!
290000b314436f4fdfada4bbf1e79ec12e9fa38aeaf1Narayan Kamath    return const_cast<ResTable&>(res).add(file->getData(), file->getSize());
2901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiconst ResTable& AaptAssets::getIncludedResources() const
2904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return mIncludedAssets.getResources(false);
2906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2908282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid AaptAssets::print(const String8& prefix) const
2909282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2910282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 innerPrefix(prefix);
2911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    innerPrefix.append("  ");
2912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    String8 innerInnerPrefix(innerPrefix);
2913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    innerInnerPrefix.append("  ");
2914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("%sConfigurations:\n", prefix.string());
2915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N=mGroupEntries.size();
2916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String8 cname = mGroupEntries.itemAt(i).toDirName(String8());
2918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("%s %s\n", prefix.string(),
2919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                cname != "" ? cname.string() : "(default)");
2920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("\n%sFiles:\n", prefix.string());
2923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    AaptDir::print(innerPrefix);
2924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    printf("\n%sResource Dirs:\n", prefix.string());
2926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t NR = resdirs.size();
2928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<NR; i++) {
2929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& d = resdirs.itemAt(i);
2930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printf("%s  Type %s\n", prefix.string(), d->getLeaf().string());
2931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        d->print(innerInnerPrefix);
2932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskisp<AaptDir> AaptAssets::resDir(const String8& name) const
2936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const size_t N = resdirs.size();
2939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    for (size_t i=0; i<N; i++) {
2940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const sp<AaptDir>& d = resdirs.itemAt(i);
2941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (d->getLeaf() == name) {
2942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return d;
2943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return NULL;
2946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibool
2949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivalid_symbol_name(const String8& symbol)
2950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
2951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static char const * const KEYWORDS[] = {
2952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "abstract", "assert", "boolean", "break",
2953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "byte", "case", "catch", "char", "class", "const", "continue",
2954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "default", "do", "double", "else", "enum", "extends", "final",
2955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "finally", "float", "for", "goto", "if", "implements", "import",
2956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "instanceof", "int", "interface", "long", "native", "new", "package",
2957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "private", "protected", "public", "return", "short", "static",
2958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "strictfp", "super", "switch", "synchronized", "this", "throw",
2959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "throws", "transient", "try", "void", "volatile", "while",
2960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        "true", "false", "null",
2961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        NULL
2962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
2963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char*const* k = KEYWORDS;
2964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char*const s = symbol.string();
2965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (*k) {
2966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (0 == strcmp(s, *k)) {
2967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
2968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
2969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        k++;
2970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
2971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return true;
2972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
2973