AaptAssets.cpp revision b8dc7bc582ee4acd9d6c1379701a002c5ddbe323
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AaptAssets.h"
6e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#include "ResourceFilter.h"
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Main.h"
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h>
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h>
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <dirent.h>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kWildcardName = "any";
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kAssetDir = "assets";
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kResourceDir = "res";
19e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kValuesDir = "values";
20e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kMipmapDir = "mipmap";
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kInvalidChars = "/\\:";
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const size_t kMaxAssetFileName = 100;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const String8 kResString(kResourceDir);
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Names of asset files must meet the following criteria:
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - the filename length must be less than kMaxAssetFileName bytes long
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    (and can't be empty)
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - all characters must be 7-bit printable ASCII
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - none of { '/' '\\' ':' }
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass in just the filename, not the full path.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool validateFileName(const char* fileName)
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* cp = fileName;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t len = 0;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*cp != '\0') {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((*cp & 0x80) != 0)
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject high ASCII
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (*cp < 0x20 || *cp >= 0x7f)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject control chars and 0x7f
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (strchr(kInvalidChars, *cp) != NULL)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject path sep chars
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cp++;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        len++;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len < 1 || len > kMaxAssetFileName)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;               // reject empty or too long
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
586c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The default to use if no other ignore pattern is defined.
596c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * const gDefaultIgnoreAssets =
60e0219c8baa9d63b3794f90ab772f1c19ecb74ec4Tor Norbye    "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~";
616c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The ignore pattern that can be passed via --ignore-assets in Main.cpp
626c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * gUserIgnoreAssets = NULL;
636c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool isHidden(const char *root, const char *path)
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
666c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // Patterns syntax:
676c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Delimiter is :
686c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can start with the flag ! to avoid printing a warning
696c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   about the file being ignored.
706c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can have the flag "<dir>" to match only directories
716c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   or <file> to match only files. Default is to match both.
726c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
736c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   where prefix/suffix must have at least 1 character (so that
746c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   we don't match a '*' catch-all pattern.)
756c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - The special filenames "." and ".." are always ignored.
766c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Otherwise the full string is matched.
776c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - match is not case-sensitive.
786c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
796c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) {
806c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        return true;
816c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
826c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
836c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    const char *delim = ":";
846c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    const char *p = gUserIgnoreAssets;
856c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (!p || !p[0]) {
866c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        p = getenv("ANDROID_AAPT_IGNORE");
876c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
886c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (!p || !p[0]) {
896c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        p = gDefaultIgnoreAssets;
906c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
916c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    char *patterns = strdup(p);
926c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
936c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    bool ignore = false;
946c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    bool chatty = true;
956c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    char *matchedPattern = NULL;
966c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
976c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    String8 fullPath(root);
986c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    fullPath.appendPath(path);
996c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    FileType type = getFileType(fullPath);
1006c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1016c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    int plen = strlen(path);
1026c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1036c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // Note: we don't have strtok_r under mingw.
1046c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    for(char *token = strtok(patterns, delim);
1056c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            !ignore && token != NULL;
1066c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token = strtok(NULL, delim)) {
1076c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        chatty = token[0] != '!';
1086c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (!chatty) token++; // skip !
1096c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (strncasecmp(token, "<dir>" , 5) == 0) {
1106c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (type != kFileTypeDirectory) continue;
1116c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token += 5;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1136c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (strncasecmp(token, "<file>", 6) == 0) {
1146c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (type != kFileTypeRegular) continue;
1156c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token += 6;
1166c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        }
1176c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1186c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        matchedPattern = token;
1196c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        int n = strlen(token);
1206c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1216c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (token[0] == '*') {
1226c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            // Match *suffix
1236c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token++;
124996b073e813ba1a22a13282ccdebb664f14ba898Ying Wang            n--;
1256c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (n <= plen) {
1266c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                ignore = strncasecmp(token, path + plen - n, n) == 0;
1276c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            }
1286c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        } else if (n > 1 && token[n - 1] == '*') {
1296c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            // Match prefix*
1306c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            ignore = strncasecmp(token, path, n - 1) == 0;
1316c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        } else {
1326c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            ignore = strcasecmp(token, path) == 0;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1366c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (ignore && chatty) {
1376c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        fprintf(stderr, "    (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n",
1386c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                type == kFileTypeDirectory ? "dir" : "file",
1396c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                path,
1406c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                matchedPattern ? matchedPattern : "");
1416c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1436c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    free(patterns);
1446c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    return ignore;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
151788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath/* static */ void AaptLocaleValue::splitAndLowerCase(const char* const chars,
152788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        Vector<String8>* parts, const char separator) {
153788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    const char *p = chars;
154788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    const char *q;
155788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    while (NULL != (q = strchr(p, separator))) {
156788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         String8 val(p, q - p);
157788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         val.toLower();
158788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         parts->add(val);
159788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         p = q+1;
160788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
161788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
162788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (p < chars + strlen(chars)) {
163788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        String8 val(p);
164788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        val.toLower();
165788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        parts->add(val);
166788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
167788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
168788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
169788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath/* static */
170788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathinline bool isAlpha(const String8& string) {
171788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const size_t length = string.length();
172788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     for (size_t i = 0; i < length; ++i) {
173788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          if (!isalpha(string[i])) {
174788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath              return false;
175788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          }
176788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
177788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
178788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     return true;
179788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
180788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
181788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath/* static */
182788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathinline bool isNumber(const String8& string) {
183788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const size_t length = string.length();
184788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     for (size_t i = 0; i < length; ++i) {
185788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          if (!isdigit(string[i])) {
186788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath              return false;
187788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          }
188788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
189788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
190788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     return true;
191788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
192788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
193788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::setLanguage(const char* languageChars) {
194788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     size_t i = 0;
195b8dc7bc582ee4acd9d6c1379701a002c5ddbe323Andreas Gampe     while ((*languageChars) != '\0' && i < sizeof(language)/sizeof(language[0])) {
196788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          language[i++] = tolower(*languageChars);
197788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          languageChars++;
198788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
199788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
200788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
201788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::setRegion(const char* regionChars) {
202788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    size_t i = 0;
203b8dc7bc582ee4acd9d6c1379701a002c5ddbe323Andreas Gampe    while ((*regionChars) != '\0' && i < sizeof(region)/sizeof(region[0])) {
204788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         region[i++] = toupper(*regionChars);
205788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         regionChars++;
206788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
207788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
208788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
209788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::setScript(const char* scriptChars) {
210788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    size_t i = 0;
211b8dc7bc582ee4acd9d6c1379701a002c5ddbe323Andreas Gampe    while ((*scriptChars) != '\0' && i < sizeof(script)/sizeof(script[0])) {
212788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         if (i == 0) {
213788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath             script[i++] = toupper(*scriptChars);
214788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         } else {
215788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath             script[i++] = tolower(*scriptChars);
216788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         }
217788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         scriptChars++;
218788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
219788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
220788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
221788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::setVariant(const char* variantChars) {
222788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     size_t i = 0;
223b8dc7bc582ee4acd9d6c1379701a002c5ddbe323Andreas Gampe     while ((*variantChars) != '\0' && i < sizeof(variant)/sizeof(variant[0])) {
224788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          variant[i++] = *variantChars;
225788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath          variantChars++;
226788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
227788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
228788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
229788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathbool AaptLocaleValue::initFromFilterString(const String8& str) {
230788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     // A locale (as specified in the filter) is an underscore separated name such
231788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     // as "en_US", "en_Latn_US", or "en_US_POSIX".
232788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     Vector<String8> parts;
233788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     splitAndLowerCase(str.string(), &parts, '_');
234788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
235788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const int numTags = parts.size();
236788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     bool valid = false;
237788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (numTags >= 1) {
238788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         const String8& lang = parts[0];
239788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
240788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath             setLanguage(lang.string());
241788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath             valid = true;
242788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         }
243788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
244788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
245788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (!valid || numTags == 1) {
246788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         return valid;
247788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
248788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
249788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     // At this point, valid == true && numTags > 1.
250788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const String8& part2 = parts[1];
251788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if ((part2.length() == 2 && isAlpha(part2)) ||
252788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         (part2.length() == 3 && isNumber(part2))) {
253788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setRegion(part2.string());
254788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else if (part2.length() == 4 && isAlpha(part2)) {
255788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setScript(part2.string());
256788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else if (part2.length() >= 5 && part2.length() <= 8) {
257788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setVariant(part2.string());
258788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else {
259788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         valid = false;
260788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
261788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
262788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (!valid || numTags == 2) {
263788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         return valid;
264788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
265788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
266788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     // At this point, valid == true && numTags > 1.
267788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const String8& part3 = parts[2];
268788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (((part3.length() == 2 && isAlpha(part3)) ||
269788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         (part3.length() == 3 && isNumber(part3))) && script[0]) {
270788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setRegion(part3.string());
271788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else if (part3.length() >= 5 && part3.length() <= 8) {
272788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setVariant(part3.string());
273788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else {
274788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         valid = false;
275788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
276788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
277788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (!valid || numTags == 3) {
278788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         return valid;
279788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
280788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
281788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     const String8& part4 = parts[3];
282788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (part4.length() >= 5 && part4.length() <= 8) {
283788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         setVariant(part4.string());
284788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     } else {
285788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         valid = false;
286788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
287788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
288788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     if (!valid || numTags > 4) {
289788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         return false;
290788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     }
291788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
292788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath     return true;
293788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
294788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
295788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathint AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int startIndex) {
296788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    const int size = parts.size();
297788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    int currentIndex = startIndex;
298788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
299788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    String8 part = parts[currentIndex];
300788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (part[0] == 'b' && part[1] == '+') {
301788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        // This is a "modified" BCP-47 language tag. Same semantics as BCP-47 tags,
302788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        // except that the separator is "+" and not "-".
303788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        Vector<String8> subtags;
304788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        AaptLocaleValue::splitAndLowerCase(part.string(), &subtags, '+');
305788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        subtags.removeItemsAt(0);
306788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        if (subtags.size() == 1) {
307788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setLanguage(subtags[0]);
308788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        } else if (subtags.size() == 2) {
309788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setLanguage(subtags[0]);
310788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
311788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // The second tag can either be a region, a variant or a script.
312788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            switch (subtags[1].size()) {
313788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 2:
314788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 3:
315788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    setRegion(subtags[1]);
316788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    break;
317788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 4:
318788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    setScript(subtags[1]);
319788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    break;
320788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 5:
321788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 6:
322788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 7:
323788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                case 8:
324788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    setVariant(subtags[1]);
325788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    break;
326788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                default:
327788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name %s\n",
328788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                            part.string());
329788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                    return -1;
330788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            }
331788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        } else if (subtags.size() == 3) {
332788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // The language is always the first subtag.
333788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setLanguage(subtags[0]);
334788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
335788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // The second subtag can either be a script or a region code.
336788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // If its size is 4, it's a script code, else it's a region code.
337788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            bool hasRegion = false;
338788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            if (subtags[1].size() == 4) {
339788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                setScript(subtags[1]);
340788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
341788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                setRegion(subtags[1]);
342788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                hasRegion = true;
343788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            } else {
344788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name %s\n", part.string());
345788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                return -1;
346788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            }
347788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
348788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // The third tag can either be a region code (if the second tag was
349788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            // a script), else a variant code.
350788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            if (subtags[2].size() > 4) {
351788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                setVariant(subtags[2]);
352788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            } else {
353788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                setRegion(subtags[2]);
354788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            }
355788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        } else if (subtags.size() == 4) {
356788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setLanguage(subtags[0]);
357788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setScript(subtags[1]);
358788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setRegion(subtags[2]);
359788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setVariant(subtags[3]);
360788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        } else {
361788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            fprintf(stderr, "ERROR: Invalid BCP-47 tag in directory name: %s\n", part.string());
362788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            return -1;
363788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        }
364788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
365788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return ++currentIndex;
366788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    } else {
367788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        if ((part.length() == 2 || part.length() == 3) && isAlpha(part)) {
368788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setLanguage(part);
369788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            if (++currentIndex == size) {
370788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                return size;
371788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            }
372788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        } else {
373788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            return currentIndex;
374788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        }
375788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
376788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        part = parts[currentIndex];
377788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        if (part.string()[0] == 'r' && part.length() == 3) {
378788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            setRegion(part.string() + 1);
379788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            if (++currentIndex == size) {
380788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                return size;
381788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            }
382788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        }
383788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
384788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
385788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    return currentIndex;
386788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
387788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
388788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
389788fa41482b9d398591b7db8b0b01839029611adNarayan KamathString8 AaptLocaleValue::toDirName() const {
390788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    String8 dirName("");
391788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (language[0]) {
392788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += language;
393788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    } else {
394788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return dirName;
395788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
396788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
397788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (script[0]) {
398788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += "-s";
399788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += script;
400788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
401788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
402788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (region[0]) {
403788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += "-r";
404788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += region;
405788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
406788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
407788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (variant[0]) {
408788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += "-v";
409788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        dirName += variant;
410788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
411788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
412788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    return dirName;
413788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
414788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
415788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::initFromResTable(const ResTable_config& config) {
416788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    config.unpackLanguage(language);
417788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    config.unpackRegion(region);
418788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (config.localeScript[0]) {
419788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        memcpy(script, config.localeScript, sizeof(config.localeScript));
420788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
421788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
422788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (config.localeVariant[0]) {
423788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
424788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
425788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
426788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
427788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathvoid AaptLocaleValue::writeTo(ResTable_config* out) const {
428788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    out->packLanguage(language);
429788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    out->packRegion(region);
430788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
431788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (script[0]) {
432788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        memcpy(out->localeScript, script, sizeof(out->localeScript));
433788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
434788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
435788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (variant[0]) {
436788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
437788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    }
438788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath}
439788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
440788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
441788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath/* static */ bool
442788fa41482b9d398591b7db8b0b01839029611adNarayan KamathAaptGroupEntry::parseFilterNamePart(const String8& part, int* axis, AxisValue* value)
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
445788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    memset(&config, 0, sizeof(ResTable_config));
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IMSI - MCC
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMccName(part.string(), &config)) {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_MCC;
450788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.mcc;
451788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IMSI - MNC
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMncName(part.string(), &config)) {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_MNC;
457788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.mnc;
458788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // locale - language
462788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (value->localeValue.initFromFilterString(part)) {
463788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        *axis = AXIS_LOCALE;
464788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4675f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    // layout direction
4685f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (getLayoutDirectionName(part.string(), &config)) {
4695f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        *axis = AXIS_LAYOUTDIR;
470788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR);
471788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
4725f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
4735f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
47469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // smallest screen dp width
47569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getSmallestScreenWidthDpName(part.string(), &config)) {
47669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SMALLESTSCREENWIDTHDP;
477788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.smallestScreenWidthDp;
478788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
479c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
480c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
481ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    // screen dp width
482ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (getScreenWidthDpName(part.string(), &config)) {
483ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *axis = AXIS_SCREENWIDTHDP;
484788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.screenWidthDp;
485788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
486ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
487ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
488ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    // screen dp height
489ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (getScreenHeightDpName(part.string(), &config)) {
490ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *axis = AXIS_SCREENHEIGHTDP;
491788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.screenHeightDp;
492788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
493ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
494ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
49569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // screen layout size
49669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutSizeName(part.string(), &config)) {
49769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SCREENLAYOUTSIZE;
498788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
499788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
50069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
50169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
50269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // screen layout long
50369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutLongName(part.string(), &config)) {
50469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SCREENLAYOUTLONG;
505788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
506788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
50769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
50869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // orientation
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getOrientationName(part.string(), &config)) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_ORIENTATION;
512788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.orientation;
513788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode type
51727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeTypeName(part.string(), &config)) {
51827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *axis = AXIS_UIMODETYPE;
519788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
520788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
52127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
52227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
52327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode night
52427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeNightName(part.string(), &config)) {
52527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *axis = AXIS_UIMODENIGHT;
526788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
527788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
52827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
52927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // density
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getDensityName(part.string(), &config)) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_DENSITY;
533788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.density;
534788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // touchscreen
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getTouchscreenName(part.string(), &config)) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_TOUCHSCREEN;
540788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.touchscreen;
541788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard hidden
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeysHiddenName(part.string(), &config)) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_KEYSHIDDEN;
547788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.inputFlags;
548788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeyboardName(part.string(), &config)) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_KEYBOARD;
554788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.keyboard;
555788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    // navigation hidden
55993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (getNavHiddenName(part.string(), &config)) {
56093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        *axis = AXIS_NAVHIDDEN;
561788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.inputFlags;
56293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        return 0;
56393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
56493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // navigation
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getNavigationName(part.string(), &config)) {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_NAVIGATION;
568788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.navigation;
569788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // screen size
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getScreenSizeName(part.string(), &config)) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_SCREENSIZE;
575788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.screenSize;
576788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // version
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getVersionName(part.string(), &config)) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_VERSION;
582788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        value->intValue = config.version;
583788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return true;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
586788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    return false;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589788fa41482b9d398591b7db8b0b01839029611adNarayan KamathAxisValue
590e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis)
591e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
592788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    AxisValue value;
593e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    switch (axis) {
594e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_MCC:
595788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.mcc;
596788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
597e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_MNC:
598788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.mnc;
599788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
600788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        case AXIS_LOCALE:
601788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.localeValue.initFromResTable(config);
602788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
6035f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        case AXIS_LAYOUTDIR:
604788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.screenLayout&ResTable_config::MASK_LAYOUTDIR;
605788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
606e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENLAYOUTSIZE:
607788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.screenLayout&ResTable_config::MASK_SCREENSIZE;
608788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
609e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_ORIENTATION:
610788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.orientation;
611788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
612e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_UIMODETYPE:
613788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
614788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
615e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_UIMODENIGHT:
616788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
617788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
618e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_DENSITY:
619788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.density;
620788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
621e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_TOUCHSCREEN:
622788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.touchscreen;
623788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
624e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_KEYSHIDDEN:
625788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.inputFlags;
626788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
627e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_KEYBOARD:
628788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.keyboard;
629788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
630e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_NAVIGATION:
631788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.navigation;
632788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
633e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENSIZE:
634788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.screenSize;
635788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
636e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SMALLESTSCREENWIDTHDP:
637788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.smallestScreenWidthDp;
638788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
639e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENWIDTHDP:
640788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.screenWidthDp;
641788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
642e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENHEIGHTDP:
643788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.screenHeightDp;
644788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
645e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_VERSION:
646788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            value.intValue = config.version;
647788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            break;
648e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
649788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
650788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    return value;
651e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
652e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
653e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool
654e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::configSameExcept(const ResTable_config& config,
655e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const ResTable_config& otherConfig, int axis)
656e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
657e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (int i=AXIS_START; i<=AXIS_END; i++) {
658e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (i == axis) {
659e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
660e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
661e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) {
662e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return false;
663e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
664e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
665e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return true;
666e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
667e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::initFromDirName(const char* dir, String8* resType)
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
671e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mParamsChanged = true;
672e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> parts;
674788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    AaptLocaleValue::splitAndLowerCase(dir, &parts, '-');
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
676788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    String8 mcc, mnc, layoutsize, layoutlong, orient, den;
6775f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers;
67869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
680788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    AaptLocaleValue locale;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = parts.size();
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = 0;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 part = parts[index];
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // resource type
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!isValidResourceType(part)) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *resType = part;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    index++;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index == N) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto success;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    part = parts[index];
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // imsi - mcc
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMccName(part.string())) {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mcc = part;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not mcc: %s\n", part.string());
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // imsi - mnc
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMncName(part.string())) {
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mnc = part;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
721788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        //printf("not mnc: %s\n", part.string());
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
724788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    index = locale.initFromDirName(parts, index);
725788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (index == -1) {
726788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        return false;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
728788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (index >= N){
729788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath        goto success;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
732788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    part = parts[index];
7335f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (getLayoutDirectionName(part.string())) {
7345f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        layoutDir = part;
7355f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
7365f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        index++;
7375f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (index == N) {
7385f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio            goto success;
7395f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        }
7405f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        part = parts[index];
7415f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    } else {
7425f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        //printf("not layout direction: %s\n", part.string());
7435f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
7445f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
74569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getSmallestScreenWidthDpName(part.string())) {
74669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        smallestwidthdp = part;
747c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
748c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        index++;
749c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (index == N) {
750c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            goto success;
751c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
752c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        part = parts[index];
753c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else {
75469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not smallest screen width dp: %s\n", part.string());
755c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
756c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
75769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenWidthDpName(part.string())) {
75869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        widthdp = part;
759c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
760c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        index++;
761c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (index == N) {
762c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            goto success;
763c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
764c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        part = parts[index];
765c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else {
76669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen width dp: %s\n", part.string());
767c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
768c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
76969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenHeightDpName(part.string())) {
77069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        heightdp = part;
771ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
772ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        index++;
773ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (index == N) {
774ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            goto success;
775ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
776ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        part = parts[index];
777ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else {
77869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen height dp: %s\n", part.string());
779ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
780ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
78169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutSizeName(part.string())) {
78269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        layoutsize = part;
783ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
784ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        index++;
785ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (index == N) {
786ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            goto success;
787ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
788ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        part = parts[index];
789ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else {
79069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen layout size: %s\n", part.string());
79169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
79269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
79369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutLongName(part.string())) {
79469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        layoutlong = part;
79569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
79669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        index++;
79769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (index == N) {
79869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            goto success;
79969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
80069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        part = parts[index];
80169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    } else {
80269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen layout long: %s\n", part.string());
803ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
804ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // orientation
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getOrientationName(part.string())) {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        orient = part;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not orientation: %s\n", part.string());
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode type
81927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeTypeName(part.string())) {
82027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        uiModeType = part;
82127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
82227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        index++;
82327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (index == N) {
82427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel            goto success;
82527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        }
82627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        part = parts[index];
82727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else {
82827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        //printf("not ui mode type: %s\n", part.string());
82927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
83027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
83127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode night
83227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeNightName(part.string())) {
83327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        uiModeNight = part;
83427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
83527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        index++;
83627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (index == N) {
83727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel            goto success;
83827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        }
83927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        part = parts[index];
84027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else {
84127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        //printf("not ui mode night: %s\n", part.string());
84227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
84327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // density
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getDensityName(part.string())) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        den = part;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not density: %s\n", part.string());
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // touchscreen
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getTouchscreenName(part.string())) {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        touch = part;
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not touchscreen: %s\n", part.string());
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard hidden
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeysHiddenName(part.string())) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        keysHidden = part;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not keysHidden: %s\n", part.string());
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeyboardName(part.string())) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = part;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not keyboard: %s\n", part.string());
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    // navigation hidden
89793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (getNavHiddenName(part.string())) {
89893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        navHidden = part;
89993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
90093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        index++;
90193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (index == N) {
90293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            goto success;
90393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
90493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        part = parts[index];
90593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else {
90693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        //printf("not navHidden: %s\n", part.string());
90793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
90893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getNavigationName(part.string())) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nav = part;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not navigation: %s\n", part.string());
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getScreenSizeName(part.string())) {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size = part;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not screen size: %s\n", part.string());
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getVersionName(part.string())) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vers = part;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not version: %s\n", part.string());
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if there are extra parts, it doesn't match
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsuccess:
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->mcc = mcc;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->mnc = mnc;
951788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    this->locale = locale;
952c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    this->screenLayoutSize = layoutsize;
953c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    this->screenLayoutLong = layoutlong;
95469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    this->smallestScreenWidthDp = smallestwidthdp;
955ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    this->screenWidthDp = widthdp;
956ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    this->screenHeightDp = heightdp;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->orientation = orient;
95827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    this->uiModeType = uiModeType;
95927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    this->uiModeNight = uiModeNight;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->density = den;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->touchscreen = touch;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->keysHidden = keysHidden;
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->keyboard = key;
96493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    this->navHidden = navHidden;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->navigation = nav;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->screenSize = size;
9675f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    this->layoutDirection = layoutDir;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->version = vers;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // what is this anyway?
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->vendor = "";
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toString() const
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 s = this->mcc;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += this->mnc;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
983788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    s += locale.toDirName();
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
9855f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    s += layoutDirection;
9865f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    s += ",";
98769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += smallestScreenWidthDp;
988c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    s += ",";
989ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += screenWidthDp;
990ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += ",";
991ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += screenHeightDp;
992ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += ",";
99369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += screenLayoutSize;
99469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += ",";
99569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += screenLayoutLong;
99669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += ",";
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += this->orientation;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
99927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += uiModeType;
100027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += ",";
100127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += uiModeNight;
100227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += ",";
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += density;
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += touchscreen;
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += keysHidden;
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += keyboard;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
101193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    s += navHidden;
101293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    s += ",";
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += navigation;
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += screenSize;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += version;
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return s;
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toDirName(const String8& resType) const
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 s = resType;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->mcc != "") {
1026e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1027e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1028e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += mcc;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->mnc != "") {
1032e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1033e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1034e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += mnc;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1037788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
1038788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    const String8 localeComponent = locale.toDirName();
1039788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    if (localeComponent != "") {
1040788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         if (s.length() > 0) {
1041788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath             s += "-";
1042788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         }
1043788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath         s += localeComponent;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1045788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath
10465f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (this->layoutDirection != "") {
10475f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (s.length() > 0) {
10485f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio            s += "-";
10495f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        }
10505f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        s += layoutDirection;
10515f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
105269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->smallestScreenWidthDp != "") {
1053e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1054e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1055e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
105669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += smallestScreenWidthDp;
1057c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1058ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (this->screenWidthDp != "") {
1059e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1060e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1061e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
1062ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        s += screenWidthDp;
1063ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1064ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (this->screenHeightDp != "") {
1065e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1066e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1067e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
1068ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        s += screenHeightDp;
1069ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
107069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->screenLayoutSize != "") {
1071e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1072e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1073e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
107469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += screenLayoutSize;
107569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
107669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->screenLayoutLong != "") {
1077e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1078e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1079e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
108069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += screenLayoutLong;
108169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->orientation != "") {
1083e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1084e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1085e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += orientation;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
108827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (this->uiModeType != "") {
1089e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1090e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1091e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
109227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        s += uiModeType;
109327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
109427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (this->uiModeNight != "") {
1095e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1096e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1097e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
109827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        s += uiModeNight;
109927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->density != "") {
1101e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1102e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1103e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += density;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->touchscreen != "") {
1107e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1108e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1109e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += touchscreen;
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->keysHidden != "") {
1113e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1114e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1115e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += keysHidden;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->keyboard != "") {
1119e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1120e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1121e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += keyboard;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
112493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (this->navHidden != "") {
1125e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1126e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1127e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
112893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        s += navHidden;
112993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->navigation != "") {
1131e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1132e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1133e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += navigation;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->screenSize != "") {
1137e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1138e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1139e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += screenSize;
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->version != "") {
1143e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
1144e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
1145e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += version;
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return s;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMccName(const char* name,
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = 0;
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* c = name;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'm') return false;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* val = c;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*c != 0) return false;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c-val != 3) return false;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int d = atoi(val);
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d != 0) {
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = d;
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMncName(const char* name,
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = 0;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* c = name;
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'm') return false;
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'n') return false;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* val = c;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*c != 0) return false;
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c-val == 0 || c-val > 3) return false;
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12075ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig    if (out) {
12085ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig        out->mnc = atoi(val);
12091d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson        if (out->mnc == 0) {
12101d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson            out->mnc = ACONFIGURATION_MNC_ZERO;
12111d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12145ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig    return true;
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12175f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Megliobool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out)
12185f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio{
12195f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (strcmp(name, kWildcardName) == 0) {
12205f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
12215f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
12225f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_ANY;
12235f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
12248a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio    } else if (strcmp(name, "ldltr") == 0) {
12255f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
12265f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
12275f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_LTR;
12285f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
12298a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio    } else if (strcmp(name, "ldrtl") == 0) {
12305f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
12315f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
12325f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_RTL;
12335f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
12345f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
12355f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
12365f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    return false;
12375f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio}
12385f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
1239c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutSizeName(const char* name,
1240c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                                     ResTable_config* out)
1241c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{
1242c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1243c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1244c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1245c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_ANY;
1246c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1247c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "small") == 0) {
1248c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1249c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1250c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_SMALL;
1251c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1252c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "normal") == 0) {
1253c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1254c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1255c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_NORMAL;
1256c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1257c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "large") == 0) {
1258c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1259c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1260c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_LARGE;
1261c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
126214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn    } else if (strcmp(name, "xlarge") == 0) {
126314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        if (out) out->screenLayout =
126414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
126514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                | ResTable_config::SCREENSIZE_XLARGE;
126614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        return true;
1267c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1268c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1269c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    return false;
1270c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn}
1271c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1272c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutLongName(const char* name,
1273c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                                     ResTable_config* out)
1274c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{
1275c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1276c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1277c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1278c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_ANY;
1279c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1280c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "long") == 0) {
1281c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1282c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1283c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_YES;
1284c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1285c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "notlong") == 0) {
1286c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1287c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1288c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_NO;
1289c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1290c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1291c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1292c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    return false;
1293c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn}
1294c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getOrientationName(const char* name,
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_ANY;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "port") == 0) {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_PORT;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "land") == 0) {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_LAND;
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "square") == 0) {
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_SQUARE;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
131527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeTypeName(const char* name,
131627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                       ResTable_config* out)
131727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{
131827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (strcmp(name, kWildcardName) == 0) {
131927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
132027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
13217299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn                | ResTable_config::UI_MODE_TYPE_ANY;
13227299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn        return true;
13237299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn    } else if (strcmp(name, "desk") == 0) {
13247299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn      if (out) out->uiMode =
13257299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
13267299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn              | ResTable_config::UI_MODE_TYPE_DESK;
132727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
132827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "car") == 0) {
132927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel      if (out) out->uiMode =
133027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
133127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              | ResTable_config::UI_MODE_TYPE_CAR;
133227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
1333e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn    } else if (strcmp(name, "television") == 0) {
1334e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn      if (out) out->uiMode =
1335e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1336e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn              | ResTable_config::UI_MODE_TYPE_TELEVISION;
1337e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn        return true;
133844fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato    } else if (strcmp(name, "appliance") == 0) {
133944fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato      if (out) out->uiMode =
134044fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
134144fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
134244fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato        return true;
134327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
134427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
134527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    return false;
134627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel}
134727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
134827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeNightName(const char* name,
134927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                          ResTable_config* out)
135027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{
135127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (strcmp(name, kWildcardName) == 0) {
135227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
135327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
135427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                | ResTable_config::UI_MODE_NIGHT_ANY;
135527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
135627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "night") == 0) {
135727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
135827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
135927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                | ResTable_config::UI_MODE_NIGHT_YES;
136027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
136127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "notnight") == 0) {
136227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel      if (out) out->uiMode =
136327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
136427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              | ResTable_config::UI_MODE_NIGHT_NO;
136527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
136627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
136727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
136827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    return false;
136927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel}
137027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getDensityName(const char* name,
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
1375a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1378a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn
1379a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn    if (strcmp(name, "nodpi") == 0) {
1380a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_NONE;
1381a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        return true;
1382a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn    }
1383a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn
1384c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "ldpi") == 0) {
1385c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_LOW;
1386c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1387c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1388c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1389c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "mdpi") == 0) {
1390c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
1391c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1392c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1393c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1394b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn    if (strcmp(name, "tvdpi") == 0) {
1395b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_TV;
1396b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn        return true;
1397b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn    }
1398b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn
1399c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "hdpi") == 0) {
1400c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_HIGH;
1401c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1402c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1403d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
1404588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn    if (strcmp(name, "xhdpi") == 0) {
1405d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XHIGH;
1406588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn        return true;
1407588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn    }
1408d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
1409d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn    if (strcmp(name, "xxhdpi") == 0) {
1410d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
1411d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        return true;
1412d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn    }
1413d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
141456a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn    if (strcmp(name, "xxxhdpi") == 0) {
141556a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
141656a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn        return true;
141756a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn    }
141856a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* c = (char*)name;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // check that we have 'dpi' after the last digit.
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (toupper(c[0]) != 'D' ||
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            toupper(c[1]) != 'P' ||
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            toupper(c[2]) != 'I' ||
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c[3] != 0) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // temporarily replace the first letter with \0 to
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // use atoi.
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char tmp = c[0];
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c[0] = '\0';
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int d = atoi(name);
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c[0] = tmp;
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d != 0) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->density = d;
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getTouchscreenName(const char* name,
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "notouch") == 0) {
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "stylus") == 0) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "finger") == 0) {
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeysHiddenName(const char* name,
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       ResTable_config* out)
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t mask = 0;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t value = 0;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
1474fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1475fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_ANY;
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keysexposed") == 0) {
1477fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1478fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_NO;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keyshidden") == 0) {
1480fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1481fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_YES;
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keyssoft") == 0) {
1483fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1484fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_SOFT;
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mask != 0) {
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeyboardName(const char* name,
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_ANY;
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "nokeys") == 0) {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "qwerty") == 0) {
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_QWERTY;
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "12key") == 0) {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_12KEY;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
151593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackbornbool AaptGroupEntry::getNavHiddenName(const char* name,
151693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                                       ResTable_config* out)
151793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn{
151893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    uint8_t mask = 0;
151993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    uint8_t value = 0;
152093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1521e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1522e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_ANY;
152393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else if (strcmp(name, "navexposed") == 0) {
1524e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1525e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_NO;
152693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else if (strcmp(name, "navhidden") == 0) {
1527e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1528e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_YES;
152993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
153093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
153193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (mask != 0) {
153293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
153393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        return true;
153493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
153593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
153693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    return false;
153793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn}
153893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getNavigationName(const char* name,
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ResTable_config* out)
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_ANY;
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "nonav") == 0) {
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_NONAV;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "dpad") == 0) {
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_DPAD;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "trackball") == 0) {
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "wheel") == 0) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_WHEEL;
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1562ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->screenWidth = out->SCREENWIDTH_ANY;
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->screenHeight = out->SCREENHEIGHT_ANY;
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* x = name;
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*x >= '0' && *x <= '9') x++;
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (x == name || *x != 'x') return false;
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 xName(name, x-name);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    x++;
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* y = x;
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*y >= '0' && *y <= '9') y++;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (y == name || *y != 0) return false;
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 yName(x, y-x);
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t w = (uint16_t)atoi(xName.string());
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t h = (uint16_t)atoi(yName.string());
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (w < h) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (out) {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->screenWidth = w;
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->screenHeight = h;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackbornbool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
159869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn{
159969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
160069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (out) {
160169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
160269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
160369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return true;
160469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
160569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
160669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (*name != 's') return false;
160769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    name++;
160869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (*name != 'w') return false;
160969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    name++;
161069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    const char* x = name;
161169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
161269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
161369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    String8 xName(name, x-name);
161469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
161569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (out) {
161669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
161769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
161869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
161969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    return true;
162069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn}
162169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
1622ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
1623ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{
1624ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1625ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (out) {
1626ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            out->screenWidthDp = out->SCREENWIDTH_ANY;
1627ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
1628ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return true;
1629ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1630ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1631ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (*name != 'w') return false;
1632ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    name++;
1633ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    const char* x = name;
1634ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
1635ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1636ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    String8 xName(name, x-name);
1637ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1638ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (out) {
1639ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        out->screenWidthDp = (uint16_t)atoi(xName.string());
1640ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1641ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1642ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    return true;
1643ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn}
1644ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1645ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
1646ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{
1647ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1648ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (out) {
1649ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            out->screenHeightDp = out->SCREENWIDTH_ANY;
1650ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
1651ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return true;
1652ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1653ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1654ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (*name != 'h') return false;
1655ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    name++;
1656ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    const char* x = name;
1657ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
1658ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1659ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    String8 xName(name, x-name);
1660ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1661ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (out) {
1662ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        out->screenHeightDp = (uint16_t)atoi(xName.string());
1663ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1664ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1665ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    return true;
1666ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn}
1667ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1668ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->sdkVersion = out->SDKVERSION_ANY;
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->minorVersion = out->MINORVERSION_ANY;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*name != 'v') {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    name++;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* s = name;
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*s >= '0' && *s <= '9') s++;
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (s == name || *s != 0) return false;
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 sdkName(name, s-name);
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (out) {
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->sdkVersion = (uint16_t)atoi(sdkName.string());
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->minorVersion = 0;
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AaptGroupEntry::compare(const AaptGroupEntry& o) const
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int v = mcc.compare(o.mcc);
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = mnc.compare(o.mnc);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = locale.compare(o.locale);
17015f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (v == 0) v = layoutDirection.compare(o.layoutDirection);
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = vendor.compare(o.vendor);
170369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
1704ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
1705ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
170669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
170769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = orientation.compare(o.orientation);
170927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (v == 0) v = uiModeType.compare(o.uiModeType);
171027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (v == 0) v = uiModeNight.compare(o.uiModeNight);
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = density.compare(o.density);
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = touchscreen.compare(o.touchscreen);
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = keysHidden.compare(o.keysHidden);
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = keyboard.compare(o.keyboard);
171593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (v == 0) v = navHidden.compare(o.navHidden);
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = navigation.compare(o.navigation);
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = screenSize.compare(o.screenSize);
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = version.compare(o.version);
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return v;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1722788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathconst ResTable_config AaptGroupEntry::toParams() const
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1724e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (!mParamsChanged) {
1725e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return mParams;
1726e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
1727e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
1728e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mParamsChanged = false;
1729788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    ResTable_config& params = mParams;
1730788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    memset(&params, 0, sizeof(ResTable_config));
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getMccName(mcc.string(), &params);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getMncName(mnc.string(), &params);
1733788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath    locale.writeTo(&params);
17345f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    getLayoutDirectionName(layoutDirection.string(), &params);
173569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
1736ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    getScreenWidthDpName(screenWidthDp.string(), &params);
1737ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    getScreenHeightDpName(screenHeightDp.string(), &params);
173869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
173969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getScreenLayoutLongName(screenLayoutLong.string(), &params);
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getOrientationName(orientation.string(), &params);
174127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    getUiModeTypeName(uiModeType.string(), &params);
174227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    getUiModeNightName(uiModeNight.string(), &params);
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getDensityName(density.string(), &params);
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getTouchscreenName(touchscreen.string(), &params);
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getKeysHiddenName(keysHidden.string(), &params);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getKeyboardName(keyboard.string(), &params);
174793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    getNavHiddenName(navHidden.string(), &params);
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getNavigationName(navigation.string(), &params);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getScreenSizeName(screenSize.string(), &params);
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getVersionName(version.string(), &params);
1751ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
1752ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    // Fix up version number based on specified parameters.
1753ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    int minSdk = 0;
175469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
175569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
1756ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
175769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        minSdk = SDK_HONEYCOMB_MR2;
1758ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
1759ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::UI_MODE_TYPE_ANY
1760ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
1761ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::UI_MODE_NIGHT_ANY) {
1762ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        minSdk = SDK_FROYO;
1763ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
1764ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::SCREENSIZE_ANY
1765ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            ||  (params.screenLayout&ResTable_config::MASK_SCREENLONG)
1766ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::SCREENLONG_ANY
1767ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            || params.density != ResTable_config::DENSITY_DEFAULT) {
1768ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        minSdk = SDK_DONUT;
1769ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    }
1770ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
1771ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    if (minSdk > params.sdkVersion) {
1772ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        params.sdkVersion = minSdk;
1773ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    }
1774ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return params;
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t size)
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (size <= mBufferSize) {
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSize = size;
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mData;
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t allocSize = (size*3)/2;
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* buf = realloc(mData, allocSize);
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buf == NULL) {
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mData = buf;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataSize = size;
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBufferSize = allocSize;
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return buf;
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t* outSize)
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outSize) {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *outSize = mDataSize;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mData;
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::padData(size_t wordSize)
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t extra = mDataSize%wordSize;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (extra == 0) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mData;
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t initial = mDataSize;
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* data = editData(initial+(wordSize-extra));
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (data != NULL) {
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memset(((uint8_t*)data) + initial, 0, wordSize-extra);
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return data;
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptFile::writeData(const void* data, size_t size)
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t end = mDataSize;
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t total = size + end;
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* buf = editData(total);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buf == NULL) {
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return UNKNOWN_ERROR;
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    memcpy(((char*)buf)+end, data, size);
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptFile::clearData()
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mData != NULL) free(mData);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mData = NULL;
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataSize = 0;
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBufferSize = 0;
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptFile::getPrintableSource() const
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (hasData()) {
1845e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        String8 name(mGroupEntry.toDirName(String8()));
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name.appendPath(mPath);
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name.append(" #generated");
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name;
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mSourceFile;
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptGroup::addFile(const sp<AaptFile>& file)
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.indexOfKey(file->getGroupEntry()) < 0) {
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file->mPath = mPath;
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFiles.add(file->getGroupEntry(), file);
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NO_ERROR;
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1865e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#if 0
1866e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n",
1867e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            file->getSourceFile().string(),
1868e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            file->getGroupEntry().toDirName(String8()).string(),
1869e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            mLeaf.string(), mPath.string());
1870e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#endif
1871e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.",
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               getPrintableSource().string());
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return UNKNOWN_ERROR;
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptGroup::removeFile(size_t index)
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	mFiles.removeItemsAt(index);
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1882e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptGroup::print(const String8& prefix) const
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1884e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("%s%s\n", prefix.string(), getPath().string());
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N=mFiles.size();
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<N; i++) {
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> file = mFiles.valueAt(i);
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const AaptGroupEntry& e = file->getGroupEntry();
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (file->hasData()) {
1891e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("%s  Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(),
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (int)file->getSize());
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1894e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("%s  Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(),
1895e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    file->getPrintableSource().string());
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1897e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        //printf("%s  File Group Entry: %s\n", prefix.string(),
1898e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        //        file->getGroupEntry().toDirName(String8()).string());
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptGroup::getPrintableSource() const
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.size() > 0) {
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Arbitrarily pull the first source file out of the list.
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFiles.valueAt(0)->getPrintableSource();
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Should never hit this case, but to be safe...
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getPath();
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file)
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.indexOfKey(name) >= 0) {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ALREADY_EXISTS;
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFiles.add(name, file);
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir)
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mDirs.indexOfKey(name) >= 0) {
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ALREADY_EXISTS;
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDirs.add(name, dir);
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptDir> AaptDir::makeDir(const String8& path)
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 name;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 remain = path;
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> subdir = this;
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (name = remain.walkPath(&remain), remain != "") {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        subdir = subdir->makeDir(name);
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t i = subdir->mDirs.indexOfKey(name);
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (i >= 0) {
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return subdir->mDirs.valueAt(i);
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name));
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    subdir->mDirs.add(name, dir);
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return dir;
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeFile(const String8& name)
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFiles.removeItem(name);
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeDir(const String8& name)
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDirs.removeItem(name);
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file)
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> group;
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.indexOfKey(leafName) >= 0) {
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = mFiles.valueFor(leafName);
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = new AaptGroup(leafName, mPath.appendPathCopy(leafName));
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFiles.add(leafName, group);
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return group->addFile(file);
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
19799bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                            const AaptGroupEntry& kind, const String8& resType,
19809bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                            sp<FilePathStore>& fullResPaths)
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> fileNames;
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DIR* dir = NULL;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dir = opendir(srcDir.string());
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dir == NULL) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Slurp the filenames out of the directory.
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (1) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            struct dirent* entry;
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            entry = readdir(dir);
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (entry == NULL)
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isHidden(srcDir.string(), entry->d_name))
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20059bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            String8 name(entry->d_name);
20069bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            fileNames.add(name);
20079bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            // Add fully qualified path for dependency purposes
20089bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            // if we're collecting them
20099bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            if (fullResPaths != NULL) {
20109bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                fullResPaths->add(srcDir.appendPathCopy(name));
20119bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            }
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        closedir(dir);
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t count = 0;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stash away the files and recursively descend into subdirectories.
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N = fileNames.size();
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < N; i++) {
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 pathName(srcDir);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pathName.appendPath(fileNames[i].string());
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = getFileType(pathName.string());
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeDirectory) {
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<AaptDir> subdir;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool notAdded = false;
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDirs.indexOfKey(fileNames[i]) >= 0) {
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                subdir = mDirs.valueFor(fileNames[i]);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i]));
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notAdded = true;
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
20399bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                                resType, fullResPaths);
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < NO_ERROR) {
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res > 0 && notAdded) {
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDirs.add(fileNames[i], subdir);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count += res;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == kFileTypeRegular) {
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<AaptFile> file = new AaptFile(pathName, kind, resType);
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t err = addLeafFile(fileNames[i], file);
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (err != NO_ERROR) {
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return err;
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count++;
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose())
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("   (ignoring non-file/dir '%s')\n", pathName.string());
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::validate() const
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t NF = mFiles.size();
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t ND = mDirs.size();
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < NF; i++) {
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Invalid filename.  Unable to add.");
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t j;
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = i+1; j < NF; j++) {
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mFiles.valueAt(j)->getLeaf().string()) == 0) {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "File is case-insensitive equivalent to: %s",
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFiles.valueAt(j)->getPrintableSource().string());
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: if ".gz", check for non-.gz; if non-, check for ".gz"
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // (this is mostly caught by the "marked" stuff, below)
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = 0; j < ND; j++) {
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "File conflicts with dir from: %s",
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mDirs.valueAt(j)->getPrintableSource().string());
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < ND; i++) {
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Invalid directory name, unable to add.");
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t j;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = i+1; j < ND; j++) {
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(),
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Directory is case-insensitive equivalent to: %s",
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mDirs.valueAt(j)->getPrintableSource().string());
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t err = mDirs.valueAt(i)->validate();
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err != NO_ERROR) {
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return err;
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptDir::print(const String8& prefix) const
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t ND=getDirs().size();
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<ND; i++) {
2134e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        getDirs().valueAt(i)->print(prefix);
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t NF=getFiles().size();
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<NF; i++) {
2139e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        getFiles().valueAt(i)->print(prefix);
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptDir::getPrintableSource() const
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.size() > 0) {
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Arbitrarily pull the first file out of the list as the source dir.
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFiles.valueAt(0)->getPrintableSource().getPathDir();
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mDirs.size() > 0) {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Or arbitrarily pull the first dir out of the list as the source dir.
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDirs.valueAt(0)->getPrintableSource().getPathDir();
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Should never hit this case, but to be safe...
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mPath;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21631644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
21641644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
21651644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    status_t err = NO_ERROR;
21661644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    size_t N = javaSymbols->mSymbols.size();
21671644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
21681644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = javaSymbols->mSymbols.keyAt(i);
21691644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
21701644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mSymbols.indexOfKey(name);
21711644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
21721644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
21731644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = UNKNOWN_ERROR;
21741644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            continue;
21751644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
21761644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
21771644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //        i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
21781644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
21791644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
21801644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
21811644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    N = javaSymbols->mNestedSymbols.size();
21821644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
21831644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
21841644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
21851644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mNestedSymbols.indexOfKey(name);
21861644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
21871644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            SourcePos pos;
21881644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            pos.error("Java symbol dir %s not defined\n", name.string());
21891644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = UNKNOWN_ERROR;
21901644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            continue;
21911644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
21921644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** applying java symbols in dir %s\n", name.string());
21931644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
21941644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (myerr != NO_ERROR) {
21951644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = myerr;
21961644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
21971644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
21981644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
21991644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return err;
22001644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
22011644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
22021644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
22031644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
22041644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
22051644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
2206e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptAssets::AaptAssets()
2207e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    : AaptDir(String8(), String8()),
2208788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath      mHavePrivateSymbols(false),
2209788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath      mChanged(false), mHaveIncludedAssets(false),
2210788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath      mRes(NULL)
2211e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
2212e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2213e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2214e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornconst SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const {
2215e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (mChanged) {
2216e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2217e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return mGroupEntries;
2218e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2219e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2220e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file)
2221e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
2222e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mChanged = true;
2223e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return AaptDir::addFile(name, file);
2224e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2225e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptFile> AaptAssets::addFile(
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& filePath, const AaptGroupEntry& entry,
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& srcDir, sp<AaptGroup>* outGroup,
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& resType)
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> dir = this;
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> group;
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptFile> file;
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 root, remain(filePath), partialPath;
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (remain.length() > 0) {
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root = remain.walkPath(&remain);
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        partialPath.appendPath(root);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8 rootStr(root);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (remain.length() == 0) {
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t i = dir->getFiles().indexOfKey(rootStr);
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= 0) {
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                group = dir->getFiles().valueAt(i);
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                group = new AaptGroup(rootStr, filePath);
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t res = dir->addFile(rootStr, group);
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res != NO_ERROR) {
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return NULL;
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType);
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t res = group->addFile(file);
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != NO_ERROR) {
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return NULL;
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t i = dir->getDirs().indexOfKey(rootStr);
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= 0) {
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = dir->getDirs().valueAt(i);
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<AaptDir> subdir = new AaptDir(rootStr, partialPath);
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t res = dir->addDir(rootStr, subdir);
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res != NO_ERROR) {
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return NULL;
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = subdir;
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mGroupEntries.add(entry);
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outGroup) *outGroup = group;
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return file;
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptAssets::addResource(const String8& leafName, const String8& path,
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                const sp<AaptFile>& file, const String8& resType)
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> res = AaptDir::makeDir(kResString);
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 dirname = file->getGroupEntry().toDirName(resType);
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> subdir = res->makeDir(dirname);
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> grr = new AaptGroup(leafName, path);
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    grr->addFile(file);
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    subdir->addFile(leafName, grr);
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int count;
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int totalCount = 0;
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FileType type;
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t dirCount =resDirs.size();
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptAssets> current = this;
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = bundle->getFileSpecCount();
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a package manifest was specified, include that first.
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (bundle->getAndroidManifestFile() != NULL) {
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // place at root of zip.
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 srcFile(bundle->getAndroidManifestFile());
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(),
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NULL, String8());
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount++;
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a directory of custom assets was supplied, slurp 'em up.
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (bundle->getAssetSourceDir()) {
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* assetDir = bundle->getAssetSourceDir();
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type = getFileType(assetDir);
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeNonexistent) {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDir);
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != kFileTypeDirectory) {
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 assetRoot(assetDir);
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry group;
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
233403589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin                                            String8(), mFullAssetPaths);
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count < 0) {
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalCount = count;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count > 0) {
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGroupEntries.add(group);
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount += count;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bundle->getVerbose())
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Found %d custom asset file%s in %s\n",
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   count, (count==1) ? "" : "s", assetDir);
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a directory of resource-specific assets was supplied, slurp 'em up.
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<dirCount; i++) {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char *res = resDirs[i];
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res) {
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = getFileType(res);
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == kFileTypeNonexistent) {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == kFileTypeDirectory) {
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i>0) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<AaptAssets> nextOverlay = new AaptAssets();
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current->setOverlay(nextOverlay);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current = nextOverlay;
23659bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                    current->setFullResPaths(mFullResPaths);
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = current->slurpResourceTree(bundle, String8(res));
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (count < 0) {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    totalCount = count;
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                totalCount += count;
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Now do any additional raw files.
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int arg=0; arg<N; arg++) {
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* assetDir = bundle->getFileSpecEntry(arg);
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type = getFileType(assetDir);
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeNonexistent) {
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir);
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != kFileTypeDirectory) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 assetRoot(assetDir);
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bundle->getVerbose())
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Processing raw dir '%s'\n", (const char*) assetDir);
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Do a recursive traversal of subdir tree.  We don't make any
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * guarantees about ordering, so we're okay with an inorder search
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * using whatever order the OS happens to hand back to us.
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
240803589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count < 0) {
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* failure; report error and remove archive */
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalCount = count;
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount += count;
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bundle->getVerbose())
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Found %d asset file%s in %s\n",
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   count, (count==1) ? "" : "s", assetDir);
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    count = validate();
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (count != NO_ERROR) {
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount = count;
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2427e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    count = filter(bundle);
2428e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (count != NO_ERROR) {
2429e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        totalCount = count;
2430e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        goto bail;
2431e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return totalCount;
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const AaptGroupEntry& kind,
24399bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                    const String8& resType,
24409bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                    sp<FilePathStore>& fullResPaths)
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
24429bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res > 0) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGroupEntries.add(kind);
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t err = 0;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DIR* dir = opendir(srcDir.string());
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dir == NULL) {
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return UNKNOWN_ERROR;
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t count = 0;
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Run through the directory, looking for dirs that match the
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expected pattern.
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (1) {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct dirent* entry = readdir(dir);
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entry == NULL) {
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isHidden(srcDir.string(), entry->d_name)) {
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 subdirName(srcDir);
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        subdirName.appendPath(entry->d_name);
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry group;
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 resType;
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool b = group.initFromDirName(entry->d_name, &resType);
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!b) {
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(),
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    entry->d_name);
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = -1;
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) {
2490588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            int maxResInt = atoi(bundle->getMaxResVersion());
2491e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            const char *verString = group.getVersionString().string();
2492588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            int dirVersionInt = atoi(verString + 1); // skip 'v' in version name
2493588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            if (dirVersionInt > maxResInt) {
2494588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick              fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name);
2495588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick              continue;
2496588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            }
2497588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        }
2498588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type = getFileType(subdirName.string());
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeDirectory) {
2502e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptDir> dir = makeDir(resType);
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
25049bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                                resType, mFullResPaths);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = res;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto bail;
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res > 0) {
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGroupEntries.add(group);
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count += res;
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2514e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Only add this directory if we don't already have a resource dir
2515e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // for the current type.  This ensures that we only add the dir once
2516e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // for all configs.
2517e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptDir> rdir = resDir(resType);
2518e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            if (rdir == NULL) {
2519e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                mResDirs.add(dir);
2520e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose()) {
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "   (ignoring file '%s')\n", subdirName.string());
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    closedir(dir);
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dir = NULL;
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != 0) {
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return err;
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t
25392412f84064c26b643c722ce914a97c4ec7776c69Andreas GampeAaptAssets::slurpResourceZip(Bundle* /* bundle */, const char* filename)
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int count = 0;
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SortedVector<AaptGroupEntry> entries;
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZipFile* zip = new ZipFile;
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = zip->open(filename, ZipFile::kOpenReadOnly);
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "error opening zip file %s\n", filename);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count = err;
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete zip;
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = zip->getNumEntries();
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<N; i++) {
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ZipEntry* entry = zip->getEntryByIndex(i);
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entry->getDeleted()) {
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 entryName(entry->getFileName());
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 dirName = entryName.getPathDir();
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 resType;
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry kind;
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 remain;
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entryName.walkPath(&remain) == kResourceDir) {
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // these are the resources, pull their type out of the directory name
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kind.initFromDirName(remain.walkPath().string(), &resType);
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // these are untyped and don't have an AaptGroupEntry
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entries.indexOf(kind) < 0) {
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            entries.add(kind);
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGroupEntries.add(kind);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // use the one from the zip file if they both exist.
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dir->removeFile(entryName.getPathLeaf());
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> file = new AaptFile(entryName, kind, resType);
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t err = dir->addLeafFile(entryName.getPathLeaf(), file);
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err != NO_ERROR) {
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string());
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = err;
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file->setCompressionMethod(entry->getCompressionMethod());
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entryName == "AndroidManifest.xml") {
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("AndroidManifest.xml\n");
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        printf("\n\nfile: %s\n", entryName.string());
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t len = entry->getUncompressedLen();
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* data = zip->uncompress(entry);
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* buf = file->editData(len);
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memcpy(buf, data, len);
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int OFF = 0;
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const unsigned char* p = (unsigned char*)data;
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const unsigned char* end = p+len;
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p += OFF;
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<32 && p < end; i++) {
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("0x%03x ", i*0x10 + OFF);
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j=0; j<0x10 && p < end; j++) {
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf(" %02x", *p);
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p++;
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("\n");
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        free(data);
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count++;
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete zip;
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::filter(Bundle* bundle)
2630e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
2631e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    ResourceFilter reqFilter;
2632e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    status_t err = reqFilter.parse(bundle->getConfigurations());
2633e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (err != NO_ERROR) {
2634e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return err;
2635e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2636e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2637e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    ResourceFilter prefFilter;
2638e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    err = prefFilter.parse(bundle->getPreferredConfigurations());
2639e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (err != NO_ERROR) {
2640e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return err;
2641e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2642e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2643e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (reqFilter.isEmpty() && prefFilter.isEmpty()) {
2644e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return NO_ERROR;
2645e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2646e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2647bd9d2bcdebfa66a0f71fa67aa256dcae4ccd93daDianne Hackborn    if (bundle->getVerbose()) {
2648e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (!reqFilter.isEmpty()) {
2649e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("Applying required filter: %s\n",
2650e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle->getConfigurations());
2651e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2652e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (!prefFilter.isEmpty()) {
2653e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("Applying preferred filter: %s\n",
2654e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle->getPreferredConfigurations());
2655e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2656e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2657e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2658e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2659e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t ND = resdirs.size();
2660e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (size_t i=0; i<ND; i++) {
2661e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& dir = resdirs.itemAt(i);
2662e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (dir->getLeaf() == kValuesDir) {
2663e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // The "value" dir is special since a single file defines
2664e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // multiple resources, so we can not do filtering on the
2665e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // files themselves.
2666e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
2667e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2668e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (dir->getLeaf() == kMipmapDir) {
2669e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // We also skip the "mipmap" directory, since the point of this
2670e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // is to include all densities without stripping.  If you put
2671e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // other configurations in here as well they won't be stripped
2672e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // either...  So don't do that.  Seriously.  What is wrong with you?
2673e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
2674e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2675e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2676e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const size_t NG = dir->getFiles().size();
2677e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        for (size_t j=0; j<NG; j++) {
2678e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptGroup> grp = dir->getFiles().valueAt(j);
2679e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2680e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // First remove any configurations we know we don't need.
2681e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            for (size_t k=0; k<grp->getFiles().size(); k++) {
2682e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                sp<AaptFile> file = grp->getFiles().valueAt(k);
2683e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (k == 0 && grp->getFiles().size() == 1) {
2684e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // If this is the only file left, we need to keep it.
2685e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // Otherwise the resource IDs we are using will be inconsistent
2686e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // with what we get when not stripping.  Sucky, but at least
2687e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // for now we can rely on the back-end doing another filtering
2688e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // pass to take this out and leave us with this resource name
2689e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // containing no entries.
2690e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    continue;
2691e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2692e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (file->getPath().getPathExtension() == ".xml") {
2693e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // We can't remove .xml files at this point, because when
2694e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // we parse them they may add identifier resources, so
2695e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // removing them can cause our resource identifiers to
2696e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // become inconsistent.
2697e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    continue;
2698e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2699e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                const ResTable_config& config(file->getGroupEntry().toParams());
2700e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (!reqFilter.match(config)) {
2701e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (bundle->getVerbose()) {
2702e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        printf("Pruning unneeded resource: %s\n",
2703e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                file->getPrintableSource().string());
2704e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2705e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    grp->removeFile(k);
2706e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    k--;
2707e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2708e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2709e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2710e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Quick check: no preferred filters, nothing more to do.
2711e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            if (prefFilter.isEmpty()) {
2712e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                continue;
2713e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2714e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
27159438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // Get the preferred density if there is one. We do not match exactly for density.
27169438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we
27179438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // pick xhdpi.
27189438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            uint32_t preferredDensity = 0;
2719788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath            const SortedVector<AxisValue>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY);
27209438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            if (preferredConfigs != NULL && preferredConfigs->size() > 0) {
2721788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath                preferredDensity = (*preferredConfigs)[0].intValue;
27229438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            }
27239438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
2724e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Now deal with preferred configurations.
2725e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            for (int axis=AXIS_START; axis<=AXIS_END; axis++) {
2726e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                for (size_t k=0; k<grp->getFiles().size(); k++) {
2727e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    sp<AaptFile> file = grp->getFiles().valueAt(k);
2728e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (k == 0 && grp->getFiles().size() == 1) {
2729e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // If this is the only file left, we need to keep it.
2730e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // Otherwise the resource IDs we are using will be inconsistent
2731e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // with what we get when not stripping.  Sucky, but at least
2732e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // for now we can rely on the back-end doing another filtering
2733e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // pass to take this out and leave us with this resource name
2734e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // containing no entries.
2735e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        continue;
2736e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2737e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (file->getPath().getPathExtension() == ".xml") {
2738e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // We can't remove .xml files at this point, because when
2739e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // we parse them they may add identifier resources, so
2740e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // removing them can cause our resource identifiers to
2741e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // become inconsistent.
2742e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        continue;
2743e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2744e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    const ResTable_config& config(file->getGroupEntry().toParams());
2745e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (!prefFilter.match(axis, config)) {
2746e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // This is a resource we would prefer not to have.  Check
2747e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // to see if have a similar variation that we would like
2748e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // to have and, if so, we can drop it.
27499438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
27509438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        uint32_t bestDensity = config.density;
27519438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
2752e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        for (size_t m=0; m<grp->getFiles().size(); m++) {
2753e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            if (m == k) continue;
2754e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            sp<AaptFile> mfile = grp->getFiles().valueAt(m);
2755e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            const ResTable_config& mconfig(mfile->getGroupEntry().toParams());
2756e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) {
27579438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                if (axis == AXIS_DENSITY && preferredDensity > 0) {
27589438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    // See if there is a better density resource
27599438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    if (mconfig.density < bestDensity &&
27609438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            mconfig.density > preferredDensity &&
27619438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            bestDensity > preferredDensity) {
27629438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // This density is between our best density and
27639438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // the preferred density, therefore it is better.
27649438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        bestDensity = mconfig.density;
27659438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    } else if (mconfig.density > bestDensity &&
27669438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            bestDensity < preferredDensity) {
27679438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // This density is better than our best density and
27689438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // our best density was smaller than our preferred
27699438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // density, so it is better.
27709438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        bestDensity = mconfig.density;
27719438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    }
27729438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                } else if (prefFilter.match(axis, mconfig)) {
2773e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    if (bundle->getVerbose()) {
2774e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                        printf("Pruning unneeded resource: %s\n",
2775e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                                file->getPrintableSource().string());
2776e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    }
2777e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    grp->removeFile(k);
2778e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    k--;
2779e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    break;
2780e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                }
2781e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            }
2782e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        }
27839438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
27849438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        if (axis == AXIS_DENSITY && preferredDensity > 0 &&
27859438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                bestDensity != config.density) {
27869438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            if (bundle->getVerbose()) {
27879438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                printf("Pruning unneeded resource: %s\n",
27889438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        file->getPrintableSource().string());
27899438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            }
27909438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            grp->removeFile(k);
27919438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            k--;
27929438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        }
2793e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2794e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2795e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2796e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2797e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2798e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2799e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return NO_ERROR;
2800e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2801e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptSymbols> sym = mSymbols.valueFor(name);
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sym == NULL) {
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sym = new AaptSymbols();
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSymbols.add(name, sym);
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sym;
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28121644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornsp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
28131644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
28141644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
28151644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (sym == NULL) {
28161644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        sym = new AaptSymbols();
28171644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        mJavaSymbols.add(name, sym);
28181644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
28191644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return sym;
28201644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
28211644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
28221644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptAssets::applyJavaSymbols()
28231644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
28241644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    size_t N = mJavaSymbols.size();
28251644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
28261644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = mJavaSymbols.keyAt(i);
28271644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
28281644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mSymbols.indexOfKey(name);
28291644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
28301644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            SourcePos pos;
28311644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            pos.error("Java symbol dir %s not defined\n", name.string());
28321644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            return UNKNOWN_ERROR;
28331644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
28341644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** applying java symbols in dir %s\n", name.string());
28351644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
28361644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (err != NO_ERROR) {
28371644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            return err;
28381644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
28391644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
28401644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
28411644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return NO_ERROR;
28421644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
28431644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
28441644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornbool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
28451644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
28461644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //        sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
28471644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //        sym.isJavaSymbol ? 1 : 0);
28481644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (!mHavePrivateSymbols) return true;
28491644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (sym.isPublic) return true;
28501644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (includePrivate && sym.isJavaSymbol) return true;
28511644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return false;
28521644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
28531644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::buildIncludedResources(Bundle* bundle)
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!mHaveIncludedAssets) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add in all includes.
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<const char*>& incl = bundle->getPackageIncludes();
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t N=incl.size();
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (size_t i=0; i<N; i++) {
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose())
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("Including resources from package: %s\n", incl[i]);
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) {
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: Asset package include '%s' not found.\n",
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        incl[i]);
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveIncludedAssets = true;
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::addIncludedResources(const sp<AaptFile>& file)
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res = getIncludedResources();
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX dirty!
28797c4887f66bfa3dad16f8b03dc825ade96d7de130Narayan Kamath    return const_cast<ResTable&>(res).add(file->getData(), file->getSize());
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst ResTable& AaptAssets::getIncludedResources() const
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mIncludedAssets.getResources(false);
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2887e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptAssets::print(const String8& prefix) const
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2889e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    String8 innerPrefix(prefix);
2890e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    innerPrefix.append("  ");
2891e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    String8 innerInnerPrefix(innerPrefix);
2892e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    innerInnerPrefix.append("  ");
2893e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("%sConfigurations:\n", prefix.string());
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N=mGroupEntries.size();
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
2896e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        String8 cname = mGroupEntries.itemAt(i).toDirName(String8());
2897e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        printf("%s %s\n", prefix.string(),
2898e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                cname != "" ? cname.string() : "(default)");
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2901e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("\n%sFiles:\n", prefix.string());
2902e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    AaptDir::print(innerPrefix);
2903e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2904e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("\n%sResource Dirs:\n", prefix.string());
2905e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2906e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t NR = resdirs.size();
2907e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (size_t i=0; i<NR; i++) {
2908e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& d = resdirs.itemAt(i);
2909e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        printf("%s  Type %s\n", prefix.string(), d->getLeaf().string());
2910e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        d->print(innerInnerPrefix);
2911e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2914e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornsp<AaptDir> AaptAssets::resDir(const String8& name) const
29151553c82e084ac5763fb393857224145506771b99Joe Onorato{
2916e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2917e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t N = resdirs.size();
29181553c82e084ac5763fb393857224145506771b99Joe Onorato    for (size_t i=0; i<N; i++) {
2919e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& d = resdirs.itemAt(i);
29201553c82e084ac5763fb393857224145506771b99Joe Onorato        if (d->getLeaf() == name) {
29211553c82e084ac5763fb393857224145506771b99Joe Onorato            return d;
29221553c82e084ac5763fb393857224145506771b99Joe Onorato        }
29231553c82e084ac5763fb393857224145506771b99Joe Onorato    }
29241553c82e084ac5763fb393857224145506771b99Joe Onorato    return NULL;
29251553c82e084ac5763fb393857224145506771b99Joe Onorato}
29261553c82e084ac5763fb393857224145506771b99Joe Onorato
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvalid_symbol_name(const String8& symbol)
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static char const * const KEYWORDS[] = {
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "abstract", "assert", "boolean", "break",
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "byte", "case", "catch", "char", "class", "const", "continue",
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "default", "do", "double", "else", "enum", "extends", "final",
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "finally", "float", "for", "goto", "if", "implements", "import",
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "instanceof", "int", "interface", "long", "native", "new", "package",
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "private", "protected", "public", "return", "short", "static",
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "strictfp", "super", "switch", "synchronized", "this", "throw",
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "throws", "transient", "try", "void", "volatile", "while",
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "true", "false", "null",
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NULL
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char*const* k = KEYWORDS;
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char*const s = symbol.string();
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*k) {
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (0 == strcmp(s, *k)) {
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        k++;
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2952