AaptAssets.cpp revision 09384303dea4f3f01d5682918d7bab9bf83a02b1
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* kDefaultLocale = "default";
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kWildcardName = "any";
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kAssetDir = "assets";
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kResourceDir = "res";
20e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kValuesDir = "values";
21e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kMipmapDir = "mipmap";
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kInvalidChars = "/\\:";
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const size_t kMaxAssetFileName = 100;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const String8 kResString(kResourceDir);
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Names of asset files must meet the following criteria:
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - the filename length must be less than kMaxAssetFileName bytes long
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    (and can't be empty)
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - all characters must be 7-bit printable ASCII
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  - none of { '/' '\\' ':' }
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass in just the filename, not the full path.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool validateFileName(const char* fileName)
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* cp = fileName;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t len = 0;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*cp != '\0') {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((*cp & 0x80) != 0)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject high ASCII
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (*cp < 0x20 || *cp >= 0x7f)
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject control chars and 0x7f
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (strchr(kInvalidChars, *cp) != NULL)
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;           // reject path sep chars
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cp++;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        len++;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len < 1 || len > kMaxAssetFileName)
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;               // reject empty or too long
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
596c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The default to use if no other ignore pattern is defined.
606c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * const gDefaultIgnoreAssets =
61e0219c8baa9d63b3794f90ab772f1c19ecb74ec4Tor Norbye    "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~";
626c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The ignore pattern that can be passed via --ignore-assets in Main.cpp
636c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * gUserIgnoreAssets = NULL;
646c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool isHidden(const char *root, const char *path)
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
676c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // Patterns syntax:
686c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Delimiter is :
696c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can start with the flag ! to avoid printing a warning
706c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   about the file being ignored.
716c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can have the flag "<dir>" to match only directories
726c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   or <file> to match only files. Default is to match both.
736c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
746c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   where prefix/suffix must have at least 1 character (so that
756c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    //   we don't match a '*' catch-all pattern.)
766c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - The special filenames "." and ".." are always ignored.
776c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - Otherwise the full string is matched.
786c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // - match is not case-sensitive.
796c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
806c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) {
816c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        return true;
826c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
836c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
846c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    const char *delim = ":";
856c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    const char *p = gUserIgnoreAssets;
866c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (!p || !p[0]) {
876c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        p = getenv("ANDROID_AAPT_IGNORE");
886c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
896c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (!p || !p[0]) {
906c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        p = gDefaultIgnoreAssets;
916c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
926c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    char *patterns = strdup(p);
936c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
946c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    bool ignore = false;
956c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    bool chatty = true;
966c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    char *matchedPattern = NULL;
976c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
986c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    String8 fullPath(root);
996c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    fullPath.appendPath(path);
1006c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    FileType type = getFileType(fullPath);
1016c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1026c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    int plen = strlen(path);
1036c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1046c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    // Note: we don't have strtok_r under mingw.
1056c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    for(char *token = strtok(patterns, delim);
1066c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            !ignore && token != NULL;
1076c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token = strtok(NULL, delim)) {
1086c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        chatty = token[0] != '!';
1096c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (!chatty) token++; // skip !
1106c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (strncasecmp(token, "<dir>" , 5) == 0) {
1116c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (type != kFileTypeDirectory) continue;
1126c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token += 5;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1146c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (strncasecmp(token, "<file>", 6) == 0) {
1156c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (type != kFileTypeRegular) continue;
1166c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token += 6;
1176c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        }
1186c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1196c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        matchedPattern = token;
1206c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        int n = strlen(token);
1216c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll
1226c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        if (token[0] == '*') {
1236c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            // Match *suffix
1246c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            token++;
125996b073e813ba1a22a13282ccdebb664f14ba898Ying Wang            n--;
1266c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            if (n <= plen) {
1276c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                ignore = strncasecmp(token, path + plen - n, n) == 0;
1286c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            }
1296c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        } else if (n > 1 && token[n - 1] == '*') {
1306c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            // Match prefix*
1316c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            ignore = strncasecmp(token, path, n - 1) == 0;
1326c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        } else {
1336c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll            ignore = strcasecmp(token, path) == 0;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1376c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    if (ignore && chatty) {
1386c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll        fprintf(stderr, "    (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n",
1396c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                type == kFileTypeDirectory ? "dir" : "file",
1406c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                path,
1416c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll                matchedPattern ? matchedPattern : "");
1426c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1446c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    free(patterns);
1456c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll    return ignore;
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// =========================================================================
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IMSI - MCC
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMccName(part.string(), &config)) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_MCC;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.mcc;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IMSI - MNC
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMncName(part.string(), &config)) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_MNC;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.mnc;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // locale - language
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_LANGUAGE;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = part[1] << 8 | part[0];
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // locale - language_REGION
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (part.length() == 5 && isalpha(part[0]) && isalpha(part[1])
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            && part[2] == '_' && isalpha(part[3]) && isalpha(part[4])) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_LANGUAGE;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = (part[4] << 24) | (part[3] << 16) | (part[1] << 8) | (part[0]);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1865f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    // layout direction
1875f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (getLayoutDirectionName(part.string(), &config)) {
1885f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        *axis = AXIS_LAYOUTDIR;
1895f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        *value = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR);
1905f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return 0;
1915f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
1925f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
19369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // smallest screen dp width
19469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getSmallestScreenWidthDpName(part.string(), &config)) {
19569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SMALLESTSCREENWIDTHDP;
19669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *value = config.smallestScreenWidthDp;
197c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return 0;
198c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
199c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
200ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    // screen dp width
201ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (getScreenWidthDpName(part.string(), &config)) {
202ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *axis = AXIS_SCREENWIDTHDP;
203ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *value = config.screenWidthDp;
204ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return 0;
205ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
206ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
207ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    // screen dp height
208ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (getScreenHeightDpName(part.string(), &config)) {
209ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *axis = AXIS_SCREENHEIGHTDP;
210ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        *value = config.screenHeightDp;
211ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return 0;
212ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
213ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
21469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // screen layout size
21569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutSizeName(part.string(), &config)) {
21669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SCREENLAYOUTSIZE;
21769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
21869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return 0;
21969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
22069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
22169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    // screen layout long
22269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutLongName(part.string(), &config)) {
22369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *axis = AXIS_SCREENLAYOUTLONG;
22469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
22569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return 0;
22669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
22769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // orientation
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getOrientationName(part.string(), &config)) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_ORIENTATION;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.orientation;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode type
23627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeTypeName(part.string(), &config)) {
23727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *axis = AXIS_UIMODETYPE;
23827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *value = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
23927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return 0;
24027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
24127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
24227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode night
24327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeNightName(part.string(), &config)) {
24427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *axis = AXIS_UIMODENIGHT;
24527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        *value = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
24627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return 0;
24727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
24827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // density
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getDensityName(part.string(), &config)) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_DENSITY;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.density;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // touchscreen
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getTouchscreenName(part.string(), &config)) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_TOUCHSCREEN;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.touchscreen;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard hidden
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeysHiddenName(part.string(), &config)) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_KEYSHIDDEN;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.inputFlags;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeyboardName(part.string(), &config)) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_KEYBOARD;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.keyboard;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    // navigation hidden
27893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (getNavHiddenName(part.string(), &config)) {
27993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        *axis = AXIS_NAVHIDDEN;
28093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        *value = config.inputFlags;
28193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        return 0;
28293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
28393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // navigation
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getNavigationName(part.string(), &config)) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_NAVIGATION;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.navigation;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // screen size
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getScreenSizeName(part.string(), &config)) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_SCREENSIZE;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.screenSize;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // version
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getVersionName(part.string(), &config)) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *axis = AXIS_VERSION;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config.version;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 1;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
308e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornuint32_t
309e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis)
310e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
311e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    switch (axis) {
312e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_MCC:
313e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.mcc;
314e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_MNC:
315e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.mnc;
316e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_LANGUAGE:
317e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return (((uint32_t)config.country[1]) << 24) | (((uint32_t)config.country[0]) << 16)
318e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                | (((uint32_t)config.language[1]) << 8) | (config.language[0]);
3195f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        case AXIS_LAYOUTDIR:
3205f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio            return config.screenLayout&ResTable_config::MASK_LAYOUTDIR;
321e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENLAYOUTSIZE:
322e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.screenLayout&ResTable_config::MASK_SCREENSIZE;
323e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_ORIENTATION:
324e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.orientation;
325e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_UIMODETYPE:
326e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
327e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_UIMODENIGHT:
328e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
329e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_DENSITY:
330e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.density;
331e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_TOUCHSCREEN:
332e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.touchscreen;
333e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_KEYSHIDDEN:
334e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.inputFlags;
335e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_KEYBOARD:
336e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.keyboard;
337e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_NAVIGATION:
338e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.navigation;
339e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENSIZE:
340e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.screenSize;
341e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SMALLESTSCREENWIDTHDP:
342e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.smallestScreenWidthDp;
343e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENWIDTHDP:
344e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.screenWidthDp;
345e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_SCREENHEIGHTDP:
346e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.screenHeightDp;
347e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        case AXIS_VERSION:
348e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return config.version;
349e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
350e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return 0;
351e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
352e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
353e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool
354e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::configSameExcept(const ResTable_config& config,
355e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const ResTable_config& otherConfig, int axis)
356e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
357e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (int i=AXIS_START; i<=AXIS_END; i++) {
358e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (i == axis) {
359e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
360e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
361e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) {
362e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            return false;
363e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
364e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
365e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return true;
366e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
367e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::initFromDirName(const char* dir, String8* resType)
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
371e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mParamsChanged = true;
372e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> parts;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
375c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den;
3765f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers;
37769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *p = dir;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *q;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (NULL != (q = strchr(p, '-'))) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 val(p, q-p);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val.toLower();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parts.add(val);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("part: %s\n", parts[parts.size()-1].string());
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p = q+1;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 val(p);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    val.toLower();
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    parts.add(val);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("part: %s\n", parts[parts.size()-1].string());
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = parts.size();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = 0;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 part = parts[index];
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // resource type
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!isValidResourceType(part)) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *resType = part;
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    index++;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index == N) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto success;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    part = parts[index];
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // imsi - mcc
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMccName(part.string())) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mcc = part;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not mcc: %s\n", part.string());
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // imsi - mnc
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getMncName(part.string())) {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mnc = part;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not mcc: %s\n", part.string());
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // locale - language
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loc = part;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not language: %s\n", part.string());
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // locale - region
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (loc.length() > 0
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            && part.length() == 3 && part[0] == 'r' && part[0] && part[1]) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loc += "-";
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part.toUpper();
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loc += part.string() + 1;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not region: %s\n", part.string());
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4645f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (getLayoutDirectionName(part.string())) {
4655f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        layoutDir = part;
4665f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
4675f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        index++;
4685f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (index == N) {
4695f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio            goto success;
4705f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        }
4715f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        part = parts[index];
4725f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    } else {
4735f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        //printf("not layout direction: %s\n", part.string());
4745f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
4755f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
47669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getSmallestScreenWidthDpName(part.string())) {
47769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        smallestwidthdp = part;
478c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
479c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        index++;
480c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (index == N) {
481c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            goto success;
482c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
483c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        part = parts[index];
484c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else {
48569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not smallest screen width dp: %s\n", part.string());
486c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
487c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
48869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenWidthDpName(part.string())) {
48969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        widthdp = part;
490c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
491c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        index++;
492c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (index == N) {
493c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            goto success;
494c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
495c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        part = parts[index];
496c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else {
49769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen width dp: %s\n", part.string());
498c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
499c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
50069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenHeightDpName(part.string())) {
50169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        heightdp = part;
502ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
503ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        index++;
504ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (index == N) {
505ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            goto success;
506ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
507ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        part = parts[index];
508ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else {
50969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen height dp: %s\n", part.string());
510ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
511ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
51269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutSizeName(part.string())) {
51369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        layoutsize = part;
514ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
515ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        index++;
516ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (index == N) {
517ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            goto success;
518ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
519ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        part = parts[index];
520ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else {
52169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen layout size: %s\n", part.string());
52269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
52369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
52469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (getScreenLayoutLongName(part.string())) {
52569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        layoutlong = part;
52669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
52769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        index++;
52869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (index == N) {
52969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            goto success;
53069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
53169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        part = parts[index];
53269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    } else {
53369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        //printf("not screen layout long: %s\n", part.string());
534ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
535ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // orientation
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getOrientationName(part.string())) {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        orient = part;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not orientation: %s\n", part.string());
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode type
55027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeTypeName(part.string())) {
55127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        uiModeType = part;
55227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
55327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        index++;
55427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (index == N) {
55527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel            goto success;
55627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        }
55727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        part = parts[index];
55827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else {
55927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        //printf("not ui mode type: %s\n", part.string());
56027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
56127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
56227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    // ui mode night
56327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (getUiModeNightName(part.string())) {
56427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        uiModeNight = part;
56527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
56627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        index++;
56727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (index == N) {
56827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel            goto success;
56927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        }
57027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        part = parts[index];
57127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else {
57227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        //printf("not ui mode night: %s\n", part.string());
57327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
57427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // density
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getDensityName(part.string())) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        den = part;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not density: %s\n", part.string());
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // touchscreen
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getTouchscreenName(part.string())) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        touch = part;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not touchscreen: %s\n", part.string());
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard hidden
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeysHiddenName(part.string())) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        keysHidden = part;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not keysHidden: %s\n", part.string());
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keyboard
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getKeyboardName(part.string())) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        key = part;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not keyboard: %s\n", part.string());
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    // navigation hidden
62893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (getNavHiddenName(part.string())) {
62993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        navHidden = part;
63093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
63193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        index++;
63293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (index == N) {
63393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            goto success;
63493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
63593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        part = parts[index];
63693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else {
63793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        //printf("not navHidden: %s\n", part.string());
63893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
63993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getNavigationName(part.string())) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nav = part;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not navigation: %s\n", part.string());
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getScreenSizeName(part.string())) {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size = part;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not screen size: %s\n", part.string());
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getVersionName(part.string())) {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vers = part;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index++;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index == N) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto success;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        part = parts[index];
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("not version: %s\n", part.string());
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if there are extra parts, it doesn't match
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsuccess:
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->mcc = mcc;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->mnc = mnc;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->locale = loc;
683c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    this->screenLayoutSize = layoutsize;
684c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    this->screenLayoutLong = layoutlong;
68569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    this->smallestScreenWidthDp = smallestwidthdp;
686ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    this->screenWidthDp = widthdp;
687ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    this->screenHeightDp = heightdp;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->orientation = orient;
68927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    this->uiModeType = uiModeType;
69027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    this->uiModeNight = uiModeNight;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->density = den;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->touchscreen = touch;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->keysHidden = keysHidden;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->keyboard = key;
69593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    this->navHidden = navHidden;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->navigation = nav;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->screenSize = size;
6985f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    this->layoutDirection = layoutDir;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->version = vers;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // what is this anyway?
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    this->vendor = "";
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toString() const
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 s = this->mcc;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += this->mnc;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += this->locale;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7165f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    s += layoutDirection;
7175f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    s += ",";
71869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += smallestScreenWidthDp;
719c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    s += ",";
720ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += screenWidthDp;
721ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += ",";
722ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += screenHeightDp;
723ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    s += ",";
72469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += screenLayoutSize;
72569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += ",";
72669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += screenLayoutLong;
72769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    s += ",";
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += this->orientation;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
73027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += uiModeType;
73127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += ",";
73227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += uiModeNight;
73327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    s += ",";
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += density;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += touchscreen;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += keysHidden;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += keyboard;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
74293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    s += navHidden;
74393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    s += ",";
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += navigation;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += screenSize;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += ",";
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += version;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return s;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toDirName(const String8& resType) const
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 s = resType;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->mcc != "") {
757e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
758e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
759e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += mcc;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->mnc != "") {
763e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
764e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
765e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += mnc;
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->locale != "") {
769e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
770e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
771e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += locale;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7745f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (this->layoutDirection != "") {
7755f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (s.length() > 0) {
7765f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio            s += "-";
7775f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        }
7785f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        s += layoutDirection;
7795f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
78069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->smallestScreenWidthDp != "") {
781e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
782e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
783e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
78469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += smallestScreenWidthDp;
785c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
786ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (this->screenWidthDp != "") {
787e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
788e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
789e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
790ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        s += screenWidthDp;
791ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
792ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (this->screenHeightDp != "") {
793e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
794e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
795e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
796ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        s += screenHeightDp;
797ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
79869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->screenLayoutSize != "") {
799e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
800e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
801e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
80269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += screenLayoutSize;
80369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
80469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (this->screenLayoutLong != "") {
805e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
806e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
807e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
80869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        s += screenLayoutLong;
80969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->orientation != "") {
811e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
812e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
813e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += orientation;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (this->uiModeType != "") {
817e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
818e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
819e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
82027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        s += uiModeType;
82127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
82227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (this->uiModeNight != "") {
823e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
824e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
825e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
82627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        s += uiModeNight;
82727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->density != "") {
829e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
830e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
831e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += density;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->touchscreen != "") {
835e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
836e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
837e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += touchscreen;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->keysHidden != "") {
841e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
842e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
843e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += keysHidden;
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->keyboard != "") {
847e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
848e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
849e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += keyboard;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (this->navHidden != "") {
853e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
854e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
855e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
85693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        s += navHidden;
85793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->navigation != "") {
859e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
860e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
861e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += navigation;
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->screenSize != "") {
865e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
866e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
867e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += screenSize;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (this->version != "") {
871e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (s.length() > 0) {
872e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            s += "-";
873e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s += version;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return s;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMccName(const char* name,
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = 0;
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* c = name;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'm') return false;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* val = c;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*c != 0) return false;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c-val != 3) return false;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int d = atoi(val);
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d != 0) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = d;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMncName(const char* name,
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->mcc = 0;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* c = name;
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'm') return false;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'n') return false;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (tolower(*c) != 'c') return false;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c++;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* val = c;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*c != 0) return false;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c-val == 0 || c-val > 3) return false;
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9355ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig    if (out) {
9365ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig        out->mnc = atoi(val);
9371d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson        if (out->mnc == 0) {
9381d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson            out->mnc = ACONFIGURATION_MNC_ZERO;
9391d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson        }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9425ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig    return true;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does this directory name fit the pattern of a locale dir ("en-rUS" or
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "default")?
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Should insist that the first two letters are lower case, and the
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second two are upper.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getLocaleName(const char* fileName,
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   ResTable_config* out)
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(fileName, kWildcardName) == 0
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            || strcmp(fileName, kDefaultLocale) == 0) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[0] = 0;
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[1] = 0;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[0] = 0;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[1] = 0;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strlen(fileName) == 2 && isalpha(fileName[0]) && isalpha(fileName[1])) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[0] = fileName[0];
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[1] = fileName[1];
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[0] = 0;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[1] = 0;
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 Project    if (strlen(fileName) == 5 &&
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isalpha(fileName[0]) &&
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isalpha(fileName[1]) &&
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fileName[2] == '-' &&
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isalpha(fileName[3]) &&
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        isalpha(fileName[4])) {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[0] = fileName[0];
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->language[1] = fileName[1];
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[0] = fileName[3];
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->country[1] = fileName[4];
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9945f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Megliobool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out)
9955f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio{
9965f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (strcmp(name, kWildcardName) == 0) {
9975f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
9985f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
9995f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_ANY;
10005f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
10018a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio    } else if (strcmp(name, "ldltr") == 0) {
10025f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
10035f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
10045f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_LTR;
10055f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
10068a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio    } else if (strcmp(name, "ldrtl") == 0) {
10075f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        if (out) out->screenLayout =
10085f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
10095f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                | ResTable_config::LAYOUTDIR_RTL;
10105f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio        return true;
10115f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    }
10125f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
10135f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    return false;
10145f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio}
10155f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio
1016c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutSizeName(const char* name,
1017c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                                     ResTable_config* out)
1018c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{
1019c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1020c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1021c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1022c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_ANY;
1023c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1024c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "small") == 0) {
1025c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1026c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1027c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_SMALL;
1028c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1029c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "normal") == 0) {
1030c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1031c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1032c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_NORMAL;
1033c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1034c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "large") == 0) {
1035c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1036c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
1037c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENSIZE_LARGE;
1038c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
103914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn    } else if (strcmp(name, "xlarge") == 0) {
104014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        if (out) out->screenLayout =
104114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
104214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                | ResTable_config::SCREENSIZE_XLARGE;
104314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        return true;
1044c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1045c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1046c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    return false;
1047c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn}
1048c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1049c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutLongName(const char* name,
1050c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                                     ResTable_config* out)
1051c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{
1052c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1053c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1054c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1055c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_ANY;
1056c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1057c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "long") == 0) {
1058c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1059c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1060c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_YES;
1061c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1062c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    } else if (strcmp(name, "notlong") == 0) {
1063c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->screenLayout =
1064c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
1065c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                | ResTable_config::SCREENLONG_NO;
1066c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1067c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1068c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1069c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    return false;
1070c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn}
1071c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getOrientationName(const char* name,
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_ANY;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "port") == 0) {
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_PORT;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "land") == 0) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_LAND;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "square") == 0) {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->orientation = out->ORIENTATION_SQUARE;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeTypeName(const char* name,
109327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                       ResTable_config* out)
109427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{
109527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (strcmp(name, kWildcardName) == 0) {
109627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
109727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
10987299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn                | ResTable_config::UI_MODE_TYPE_ANY;
10997299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn        return true;
11007299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn    } else if (strcmp(name, "desk") == 0) {
11017299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn      if (out) out->uiMode =
11027299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
11037299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn              | ResTable_config::UI_MODE_TYPE_DESK;
110427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
110527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "car") == 0) {
110627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel      if (out) out->uiMode =
110727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
110827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              | ResTable_config::UI_MODE_TYPE_CAR;
110927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
1110e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn    } else if (strcmp(name, "television") == 0) {
1111e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn      if (out) out->uiMode =
1112e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
1113e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn              | ResTable_config::UI_MODE_TYPE_TELEVISION;
1114e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn        return true;
111544fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato    } else if (strcmp(name, "appliance") == 0) {
111644fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato      if (out) out->uiMode =
111744fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
111844fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
111944fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato        return true;
112027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
112127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
112227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    return false;
112327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel}
112427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
112527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeNightName(const char* name,
112627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                          ResTable_config* out)
112727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{
112827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (strcmp(name, kWildcardName) == 0) {
112927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
113027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
113127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                | ResTable_config::UI_MODE_NIGHT_ANY;
113227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
113327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "night") == 0) {
113427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        if (out) out->uiMode =
113527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
113627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                | ResTable_config::UI_MODE_NIGHT_YES;
113727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
113827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    } else if (strcmp(name, "notnight") == 0) {
113927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel      if (out) out->uiMode =
114027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
114127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel              | ResTable_config::UI_MODE_NIGHT_NO;
114227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel        return true;
114327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    }
114427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
114527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    return false;
114627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel}
114727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getDensityName(const char* name,
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ResTable_config* out)
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
1152a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1155a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn
1156a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn    if (strcmp(name, "nodpi") == 0) {
1157a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_NONE;
1158a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn        return true;
1159a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn    }
1160a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn
1161c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "ldpi") == 0) {
1162c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_LOW;
1163c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1164c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1165c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1166c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "mdpi") == 0) {
1167c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
1168c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1169c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1170c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn
1171b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn    if (strcmp(name, "tvdpi") == 0) {
1172b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_TV;
1173b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn        return true;
1174b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn    }
1175b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn
1176c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    if (strcmp(name, "hdpi") == 0) {
1177c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_HIGH;
1178c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        return true;
1179c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    }
1180d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
1181588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn    if (strcmp(name, "xhdpi") == 0) {
1182d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XHIGH;
1183588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn        return true;
1184588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn    }
1185d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
1186d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn    if (strcmp(name, "xxhdpi") == 0) {
1187d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
1188d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn        return true;
1189d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn    }
1190d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn
119156a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn    if (strcmp(name, "xxxhdpi") == 0) {
119256a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
119356a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn        return true;
119456a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn    }
119556a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* c = (char*)name;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*c >= '0' && *c <= '9') {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c++;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // check that we have 'dpi' after the last digit.
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (toupper(c[0]) != 'D' ||
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            toupper(c[1]) != 'P' ||
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            toupper(c[2]) != 'I' ||
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c[3] != 0) {
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // temporarily replace the first letter with \0 to
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // use atoi.
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char tmp = c[0];
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c[0] = '\0';
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int d = atoi(name);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c[0] = tmp;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d != 0) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->density = d;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getTouchscreenName(const char* name,
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "notouch") == 0) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "stylus") == 0) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "finger") == 0) {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeysHiddenName(const char* name,
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       ResTable_config* out)
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t mask = 0;
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t value = 0;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
1251fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1252fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_ANY;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keysexposed") == 0) {
1254fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1255fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_NO;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keyshidden") == 0) {
1257fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1258fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_YES;
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "keyssoft") == 0) {
1260fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        mask = ResTable_config::MASK_KEYSHIDDEN;
1261fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root        value = ResTable_config::KEYSHIDDEN_SOFT;
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mask != 0) {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeyboardName(const char* name,
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ResTable_config* out)
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_ANY;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "nokeys") == 0) {
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "qwerty") == 0) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_QWERTY;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "12key") == 0) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->keyboard = out->KEYBOARD_12KEY;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackbornbool AaptGroupEntry::getNavHiddenName(const char* name,
129393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                                       ResTable_config* out)
129493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn{
129593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    uint8_t mask = 0;
129693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    uint8_t value = 0;
129793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1298e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1299e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_ANY;
130093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else if (strcmp(name, "navexposed") == 0) {
1301e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1302e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_NO;
130393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    } else if (strcmp(name, "navhidden") == 0) {
1304e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        mask = ResTable_config::MASK_NAVHIDDEN;
1305e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root        value = ResTable_config::NAVHIDDEN_YES;
130693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
130793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
130893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (mask != 0) {
130993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
131093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        return true;
131193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    }
131293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
131393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    return false;
131493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn}
131593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getNavigationName(const char* name,
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ResTable_config* out)
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_ANY;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "nonav") == 0) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_NONAV;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "dpad") == 0) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_DPAD;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "trackball") == 0) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (strcmp(name, "wheel") == 0) {
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) out->navigation = out->NAVIGATION_WHEEL;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return false;
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->screenWidth = out->SCREENWIDTH_ANY;
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->screenHeight = out->SCREENHEIGHT_ANY;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* x = name;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*x >= '0' && *x <= '9') x++;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (x == name || *x != 'x') return false;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 xName(name, x-name);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    x++;
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* y = x;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*y >= '0' && *y <= '9') y++;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (y == name || *y != 0) return false;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 yName(x, y-x);
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t w = (uint16_t)atoi(xName.string());
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint16_t h = (uint16_t)atoi(yName.string());
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (w < h) {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (out) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->screenWidth = w;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->screenHeight = h;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackbornbool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
137569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn{
137669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
137769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (out) {
137869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
137969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
138069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return true;
138169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
138269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
138369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (*name != 's') return false;
138469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    name++;
138569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (*name != 'w') return false;
138669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    name++;
138769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    const char* x = name;
138869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
138969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
139069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    String8 xName(name, x-name);
139169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
139269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (out) {
139369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
139469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
139569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
139669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    return true;
139769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn}
139869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
1399ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
1400ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{
1401ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1402ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (out) {
1403ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            out->screenWidthDp = out->SCREENWIDTH_ANY;
1404ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
1405ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return true;
1406ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1407ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1408ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (*name != 'w') return false;
1409ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    name++;
1410ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    const char* x = name;
1411ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
1412ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1413ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    String8 xName(name, x-name);
1414ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1415ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (out) {
1416ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        out->screenWidthDp = (uint16_t)atoi(xName.string());
1417ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1418ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1419ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    return true;
1420ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn}
1421ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1422ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
1423ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{
1424ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (strcmp(name, kWildcardName) == 0) {
1425ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        if (out) {
1426ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            out->screenHeightDp = out->SCREENWIDTH_ANY;
1427ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        }
1428ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        return true;
1429ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1430ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1431ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (*name != 'h') return false;
1432ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    name++;
1433ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    const char* x = name;
1434ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    while (*x >= '0' && *x <= '9') x++;
1435ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
1436ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    String8 xName(name, x-name);
1437ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1438ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (out) {
1439ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn        out->screenHeightDp = (uint16_t)atoi(xName.string());
1440ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    }
1441ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1442ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    return true;
1443ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn}
1444ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
1445ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(name, kWildcardName) == 0) {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (out) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->sdkVersion = out->SDKVERSION_ANY;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out->minorVersion = out->MINORVERSION_ANY;
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (*name != 'v') {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    name++;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* s = name;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*s >= '0' && *s <= '9') s++;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (s == name || *s != 0) return false;
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 sdkName(name, s-name);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (out) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->sdkVersion = (uint16_t)atoi(sdkName.string());
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out->minorVersion = 0;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AaptGroupEntry::compare(const AaptGroupEntry& o) const
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int v = mcc.compare(o.mcc);
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = mnc.compare(o.mnc);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = locale.compare(o.locale);
14785f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    if (v == 0) v = layoutDirection.compare(o.layoutDirection);
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = vendor.compare(o.vendor);
148069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
1481ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
1482ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
148369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
148469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = orientation.compare(o.orientation);
148627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (v == 0) v = uiModeType.compare(o.uiModeType);
148727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    if (v == 0) v = uiModeNight.compare(o.uiModeNight);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = density.compare(o.density);
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = touchscreen.compare(o.touchscreen);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = keysHidden.compare(o.keysHidden);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = keyboard.compare(o.keyboard);
149293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    if (v == 0) v = navHidden.compare(o.navHidden);
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = navigation.compare(o.navigation);
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = screenSize.compare(o.screenSize);
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (v == 0) v = version.compare(o.version);
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return v;
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornconst ResTable_config& AaptGroupEntry::toParams() const
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1501e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (!mParamsChanged) {
1502e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return mParams;
1503e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
1504e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
1505e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mParamsChanged = false;
1506e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    ResTable_config& params(mParams);
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    memset(&params, 0, sizeof(params));
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getMccName(mcc.string(), &params);
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getMncName(mnc.string(), &params);
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getLocaleName(locale.string(), &params);
15115f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio    getLayoutDirectionName(layoutDirection.string(), &params);
151269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
1513ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    getScreenWidthDpName(screenWidthDp.string(), &params);
1514ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    getScreenHeightDpName(screenHeightDp.string(), &params);
151569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
151669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    getScreenLayoutLongName(screenLayoutLong.string(), &params);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getOrientationName(orientation.string(), &params);
151827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    getUiModeTypeName(uiModeType.string(), &params);
151927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    getUiModeNightName(uiModeNight.string(), &params);
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getDensityName(density.string(), &params);
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getTouchscreenName(touchscreen.string(), &params);
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getKeysHiddenName(keysHidden.string(), &params);
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getKeyboardName(keyboard.string(), &params);
152493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    getNavHiddenName(navHidden.string(), &params);
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getNavigationName(navigation.string(), &params);
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getScreenSizeName(screenSize.string(), &params);
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getVersionName(version.string(), &params);
1528ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
1529ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    // Fix up version number based on specified parameters.
1530ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    int minSdk = 0;
153169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
153269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
1533ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn            || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
153469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        minSdk = SDK_HONEYCOMB_MR2;
1535ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn    } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
1536ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::UI_MODE_TYPE_ANY
1537ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
1538ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::UI_MODE_NIGHT_ANY) {
1539ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        minSdk = SDK_FROYO;
1540ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
1541ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::SCREENSIZE_ANY
1542ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            ||  (params.screenLayout&ResTable_config::MASK_SCREENLONG)
1543ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn                != ResTable_config::SCREENLONG_ANY
1544ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn            || params.density != ResTable_config::DENSITY_DEFAULT) {
1545ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        minSdk = SDK_DONUT;
1546ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    }
1547ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
1548ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    if (minSdk > params.sdkVersion) {
1549ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn        params.sdkVersion = minSdk;
1550ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn    }
1551ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return params;
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t size)
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (size <= mBufferSize) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSize = size;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mData;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t allocSize = (size*3)/2;
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* buf = realloc(mData, allocSize);
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buf == NULL) {
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mData = buf;
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataSize = size;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBufferSize = allocSize;
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return buf;
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t* outSize)
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outSize) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *outSize = mDataSize;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mData;
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::padData(size_t wordSize)
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t extra = mDataSize%wordSize;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (extra == 0) {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mData;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t initial = mDataSize;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* data = editData(initial+(wordSize-extra));
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (data != NULL) {
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memset(((uint8_t*)data) + initial, 0, wordSize-extra);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return data;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptFile::writeData(const void* data, size_t size)
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t end = mDataSize;
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t total = size + end;
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* buf = editData(total);
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (buf == NULL) {
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return UNKNOWN_ERROR;
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    memcpy(((char*)buf)+end, data, size);
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptFile::clearData()
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mData != NULL) free(mData);
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mData = NULL;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataSize = 0;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBufferSize = 0;
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptFile::getPrintableSource() const
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (hasData()) {
1622e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        String8 name(mGroupEntry.toDirName(String8()));
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name.appendPath(mPath);
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name.append(" #generated");
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mSourceFile;
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
163409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinskistatus_t AaptGroup::addFile(const sp<AaptFile>& file, const bool overwriteDuplicate)
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
163609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    ssize_t index = mFiles.indexOfKey(file->getGroupEntry());
163709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    if (index >= 0 && overwriteDuplicate) {
163809384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        fprintf(stderr, "warning: overwriting '%s' with '%s'\n",
163909384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                mFiles[index]->getSourceFile().string(),
164009384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                file->getSourceFile().string());
164109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        removeFile(index);
164209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        index = -1;
164309384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    }
164409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski
164509384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    if (index < 0) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file->mPath = mPath;
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFiles.add(file->getGroupEntry(), file);
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NO_ERROR;
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1651e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#if 0
1652e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n",
1653e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            file->getSourceFile().string(),
1654e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            file->getGroupEntry().toDirName(String8()).string(),
1655e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            mLeaf.string(), mPath.string());
1656e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#endif
1657e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.",
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               getPrintableSource().string());
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return UNKNOWN_ERROR;
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptGroup::removeFile(size_t index)
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	mFiles.removeItemsAt(index);
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1668e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptGroup::print(const String8& prefix) const
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1670e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("%s%s\n", prefix.string(), getPath().string());
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N=mFiles.size();
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<N; i++) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> file = mFiles.valueAt(i);
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const AaptGroupEntry& e = file->getGroupEntry();
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (file->hasData()) {
1677e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("%s  Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(),
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (int)file->getSize());
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1680e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("%s  Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(),
1681e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    file->getPrintableSource().string());
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1683e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        //printf("%s  File Group Entry: %s\n", prefix.string(),
1684e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        //        file->getGroupEntry().toDirName(String8()).string());
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptGroup::getPrintableSource() const
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.size() > 0) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Arbitrarily pull the first source file out of the list.
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFiles.valueAt(0)->getPrintableSource();
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Should never hit this case, but to be safe...
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getPath();
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file)
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.indexOfKey(name) >= 0) {
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ALREADY_EXISTS;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFiles.add(name, file);
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir)
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mDirs.indexOfKey(name) >= 0) {
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ALREADY_EXISTS;
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDirs.add(name, dir);
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptDir> AaptDir::makeDir(const String8& path)
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 name;
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 remain = path;
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> subdir = this;
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (name = remain.walkPath(&remain), remain != "") {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        subdir = subdir->makeDir(name);
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t i = subdir->mDirs.indexOfKey(name);
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (i >= 0) {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return subdir->mDirs.valueAt(i);
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name));
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    subdir->mDirs.add(name, dir);
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return dir;
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeFile(const String8& name)
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFiles.removeItem(name);
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeDir(const String8& name)
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDirs.removeItem(name);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
175109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinskistatus_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file,
175209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        const bool overwrite)
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> group;
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.indexOfKey(leafName) >= 0) {
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = mFiles.valueFor(leafName);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        group = new AaptGroup(leafName, mPath.appendPathCopy(leafName));
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFiles.add(leafName, group);
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    return group->addFile(file, overwrite);
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
17669bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                            const AaptGroupEntry& kind, const String8& resType,
176709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                            sp<FilePathStore>& fullResPaths, const bool overwrite)
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> fileNames;
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DIR* dir = NULL;
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dir = opendir(srcDir.string());
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dir == NULL) {
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Slurp the filenames out of the directory.
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (1) {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            struct dirent* entry;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            entry = readdir(dir);
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (entry == NULL)
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isHidden(srcDir.string(), entry->d_name))
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17929bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            String8 name(entry->d_name);
17939bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            fileNames.add(name);
17949bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            // Add fully qualified path for dependency purposes
17959bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            // if we're collecting them
17969bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            if (fullResPaths != NULL) {
17979bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                fullResPaths->add(srcDir.appendPathCopy(name));
17989bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin            }
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        closedir(dir);
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t count = 0;
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stash away the files and recursively descend into subdirectories.
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N = fileNames.size();
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < N; i++) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 pathName(srcDir);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type;
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pathName.appendPath(fileNames[i].string());
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = getFileType(pathName.string());
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeDirectory) {
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<AaptDir> subdir;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool notAdded = false;
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDirs.indexOfKey(fileNames[i]) >= 0) {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                subdir = mDirs.valueFor(fileNames[i]);
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i]));
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notAdded = true;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t res = subdir->slurpFullTree(bundle, pathName, kind,
182609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                                                resType, fullResPaths, overwrite);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < NO_ERROR) {
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res > 0 && notAdded) {
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDirs.add(fileNames[i], subdir);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count += res;
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == kFileTypeRegular) {
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<AaptFile> file = new AaptFile(pathName, kind, resType);
183609384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            status_t err = addLeafFile(fileNames[i], file, overwrite);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (err != NO_ERROR) {
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return err;
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count++;
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose())
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("   (ignoring non-file/dir '%s')\n", pathName.string());
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::validate() const
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t NF = mFiles.size();
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t ND = mDirs.size();
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < NF; i++) {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Invalid filename.  Unable to add.");
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t j;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = i+1; j < NF; j++) {
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mFiles.valueAt(j)->getLeaf().string()) == 0) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "File is case-insensitive equivalent to: %s",
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFiles.valueAt(j)->getPrintableSource().string());
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: if ".gz", check for non-.gz; if non-, check for ".gz"
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // (this is mostly caught by the "marked" stuff, below)
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = 0; j < ND; j++) {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(),
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error(
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "File conflicts with dir from: %s",
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mDirs.valueAt(j)->getPrintableSource().string());
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i = 0; i < ND; i++) {
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) {
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Invalid directory name, unable to add.");
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t j;
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (j = i+1; j < ND; j++) {
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(),
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           mDirs.valueAt(j)->getLeaf().string()) == 0) {
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error(
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Directory is case-insensitive equivalent to: %s",
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mDirs.valueAt(j)->getPrintableSource().string());
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t err = mDirs.valueAt(i)->validate();
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err != NO_ERROR) {
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return err;
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1916e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptDir::print(const String8& prefix) const
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t ND=getDirs().size();
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i;
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<ND; i++) {
1921e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        getDirs().valueAt(i)->print(prefix);
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t NF=getFiles().size();
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0; i<NF; i++) {
1926e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        getFiles().valueAt(i)->print(prefix);
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptDir::getPrintableSource() const
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFiles.size() > 0) {
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Arbitrarily pull the first file out of the list as the source dir.
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFiles.valueAt(0)->getPrintableSource().getPathDir();
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mDirs.size() > 0) {
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Or arbitrarily pull the first dir out of the list as the source dir.
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDirs.valueAt(0)->getPrintableSource().getPathDir();
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Should never hit this case, but to be safe...
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mPath;
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =========================================================================
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19501644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
19511644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
19521644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    status_t err = NO_ERROR;
19531644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    size_t N = javaSymbols->mSymbols.size();
19541644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
19551644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = javaSymbols->mSymbols.keyAt(i);
19561644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
19571644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mSymbols.indexOfKey(name);
19581644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
19591644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
19601644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = UNKNOWN_ERROR;
19611644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            continue;
19621644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
19631644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
19641644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //        i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
19651644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
19661644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
19671644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
19681644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    N = javaSymbols->mNestedSymbols.size();
19691644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
19701644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
19711644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
19721644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mNestedSymbols.indexOfKey(name);
19731644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
19741644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            SourcePos pos;
19751644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            pos.error("Java symbol dir %s not defined\n", name.string());
19761644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = UNKNOWN_ERROR;
19771644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            continue;
19781644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
19791644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** applying java symbols in dir %s\n", name.string());
19801644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
19811644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (myerr != NO_ERROR) {
19821644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            err = myerr;
19831644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
19841644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
19851644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
19861644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return err;
19871644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
19881644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
19891644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
19901644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
19911644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// =========================================================================
19921644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
1993e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptAssets::AaptAssets()
1994e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    : AaptDir(String8(), String8()),
1995e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn      mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
1996e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
1997e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
1998e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
1999e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornconst SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const {
2000e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (mChanged) {
2001e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2002e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return mGroupEntries;
2003e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2004e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2005e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file)
2006e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
2007e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    mChanged = true;
2008e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return AaptDir::addFile(name, file);
2009e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2010e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptFile> AaptAssets::addFile(
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& filePath, const AaptGroupEntry& entry,
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& srcDir, sp<AaptGroup>* outGroup,
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& resType)
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> dir = this;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> group;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptFile> file;
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 root, remain(filePath), partialPath;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (remain.length() > 0) {
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root = remain.walkPath(&remain);
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        partialPath.appendPath(root);
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8 rootStr(root);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (remain.length() == 0) {
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t i = dir->getFiles().indexOfKey(rootStr);
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= 0) {
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                group = dir->getFiles().valueAt(i);
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                group = new AaptGroup(rootStr, filePath);
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t res = dir->addFile(rootStr, group);
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res != NO_ERROR) {
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return NULL;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType);
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t res = group->addFile(file);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != NO_ERROR) {
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return NULL;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t i = dir->getDirs().indexOfKey(rootStr);
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= 0) {
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = dir->getDirs().valueAt(i);
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<AaptDir> subdir = new AaptDir(rootStr, partialPath);
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t res = dir->addDir(rootStr, subdir);
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res != NO_ERROR) {
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return NULL;
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = subdir;
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mGroupEntries.add(entry);
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outGroup) *outGroup = group;
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return file;
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptAssets::addResource(const String8& leafName, const String8& path,
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                const sp<AaptFile>& file, const String8& resType)
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> res = AaptDir::makeDir(kResString);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 dirname = file->getGroupEntry().toDirName(resType);
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptDir> subdir = res->makeDir(dirname);
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptGroup> grr = new AaptGroup(leafName, path);
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    grr->addFile(file);
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    subdir->addFile(leafName, grr);
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int count;
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int totalCount = 0;
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FileType type;
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t dirCount =resDirs.size();
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptAssets> current = this;
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = bundle->getFileSpecCount();
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a package manifest was specified, include that first.
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (bundle->getAndroidManifestFile() != NULL) {
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // place at root of zip.
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 srcFile(bundle->getAndroidManifestFile());
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(),
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NULL, String8());
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount++;
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a directory of custom assets was supplied, slurp 'em up.
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
210209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    const Vector<const char*>& assetDirs = bundle->getAssetSourceDirs();
210309384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    const int AN = assetDirs.size();
210409384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski    for (int i = 0; i < AN; i++) {
210509384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        FileType type = getFileType(assetDirs[i]);
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeNonexistent) {
210709384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDirs[i]);
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != kFileTypeDirectory) {
211109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDirs[i]);
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211509384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        String8 assetRoot(assetDirs[i]);
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir));
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry group;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count = assetAaptDir->slurpFullTree(bundle, assetRoot, group,
211909384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                                            String8(), mFullAssetPaths, true);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count < 0) {
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalCount = count;
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count > 0) {
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGroupEntries.add(group);
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount += count;
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
212909384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        if (bundle->getVerbose()) {
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Found %d custom asset file%s in %s\n",
213109384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski                   count, (count==1) ? "" : "s", assetDirs[i]);
213209384303dea4f3f01d5682918d7bab9bf83a02b1Adam Lesinski        }
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a directory of resource-specific assets was supplied, slurp 'em up.
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<dirCount; i++) {
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char *res = resDirs[i];
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res) {
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = getFileType(res);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == kFileTypeNonexistent) {
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == kFileTypeDirectory) {
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i>0) {
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<AaptAssets> nextOverlay = new AaptAssets();
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current->setOverlay(nextOverlay);
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current = nextOverlay;
21519bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                    current->setFullResPaths(mFullResPaths);
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = current->slurpResourceTree(bundle, String8(res));
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (count < 0) {
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    totalCount = count;
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto bail;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                totalCount += count;
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else {
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Now do any additional raw files.
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int arg=0; arg<N; arg++) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* assetDir = bundle->getFileSpecEntry(arg);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type = getFileType(assetDir);
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeNonexistent) {
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir);
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != kFileTypeDirectory) {
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir);
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return UNKNOWN_ERROR;
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 assetRoot(assetDir);
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bundle->getVerbose())
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Processing raw dir '%s'\n", (const char*) assetDir);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Do a recursive traversal of subdir tree.  We don't make any
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * guarantees about ordering, so we're okay with an inorder search
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * using whatever order the OS happens to hand back to us.
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
219403589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin        count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count < 0) {
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* failure; report error and remove archive */
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalCount = count;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount += count;
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bundle->getVerbose())
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("Found %d asset file%s in %s\n",
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   count, (count==1) ? "" : "s", assetDir);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    count = validate();
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (count != NO_ERROR) {
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        totalCount = count;
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2213e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    count = filter(bundle);
2214e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (count != NO_ERROR) {
2215e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        totalCount = count;
2216e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        goto bail;
2217e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return totalCount;
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const AaptGroupEntry& kind,
22259bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                    const String8& resType,
22269bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                    sp<FilePathStore>& fullResPaths)
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
22289bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin    ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res > 0) {
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGroupEntries.add(kind);
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir)
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t err = 0;
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DIR* dir = opendir(srcDir.string());
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dir == NULL) {
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return UNKNOWN_ERROR;
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t count = 0;
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Run through the directory, looking for dirs that match the
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expected pattern.
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (1) {
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct dirent* entry = readdir(dir);
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entry == NULL) {
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isHidden(srcDir.string(), entry->d_name)) {
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 subdirName(srcDir);
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        subdirName.appendPath(entry->d_name);
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry group;
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 resType;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool b = group.initFromDirName(entry->d_name, &resType);
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!b) {
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(),
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    entry->d_name);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = -1;
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2275e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) {
2276588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            int maxResInt = atoi(bundle->getMaxResVersion());
2277e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            const char *verString = group.getVersionString().string();
2278588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            int dirVersionInt = atoi(verString + 1); // skip 'v' in version name
2279588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            if (dirVersionInt > maxResInt) {
2280588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick              fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name);
2281588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick              continue;
2282588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick            }
2283588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick        }
2284588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileType type = getFileType(subdirName.string());
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == kFileTypeDirectory) {
2288e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptDir> dir = makeDir(resType);
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t res = dir->slurpFullTree(bundle, subdirName, group,
22909bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin                                                resType, mFullResPaths);
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = res;
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                goto bail;
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res > 0) {
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mGroupEntries.add(group);
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count += res;
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2300e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Only add this directory if we don't already have a resource dir
2301e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // for the current type.  This ensures that we only add the dir once
2302e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // for all configs.
2303e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptDir> rdir = resDir(resType);
2304e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            if (rdir == NULL) {
2305e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                mResDirs.add(dir);
2306e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose()) {
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "   (ignoring file '%s')\n", subdirName.string());
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    closedir(dir);
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dir = NULL;
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != 0) {
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return err;
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int count = 0;
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SortedVector<AaptGroupEntry> entries;
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZipFile* zip = new ZipFile;
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = zip->open(filename, ZipFile::kOpenReadOnly);
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fprintf(stderr, "error opening zip file %s\n", filename);
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count = err;
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete zip;
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = zip->getNumEntries();
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<N; i++) {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ZipEntry* entry = zip->getEntryByIndex(i);
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entry->getDeleted()) {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 entryName(entry->getFileName());
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 dirName = entryName.getPathDir();
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName);
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 resType;
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AaptGroupEntry kind;
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 remain;
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entryName.walkPath(&remain) == kResourceDir) {
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // these are the resources, pull their type out of the directory name
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kind.initFromDirName(remain.walkPath().string(), &resType);
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // these are untyped and don't have an AaptGroupEntry
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entries.indexOf(kind) < 0) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            entries.add(kind);
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGroupEntries.add(kind);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // use the one from the zip file if they both exist.
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dir->removeFile(entryName.getPathLeaf());
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AaptFile> file = new AaptFile(entryName, kind, resType);
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t err = dir->addLeafFile(entryName.getPathLeaf(), file);
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err != NO_ERROR) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string());
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = err;
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto bail;
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file->setCompressionMethod(entry->getCompressionMethod());
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entryName == "AndroidManifest.xml") {
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("AndroidManifest.xml\n");
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        printf("\n\nfile: %s\n", entryName.string());
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t len = entry->getUncompressedLen();
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* data = zip->uncompress(entry);
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* buf = file->editData(len);
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        memcpy(buf, data, len);
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int OFF = 0;
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const unsigned char* p = (unsigned char*)data;
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const unsigned char* end = p+len;
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p += OFF;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<32 && p < end; i++) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("0x%03x ", i*0x10 + OFF);
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j=0; j<0x10 && p < end; j++) {
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf(" %02x", *p);
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p++;
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            printf("\n");
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        free(data);
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count++;
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete zip;
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return count;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2415e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::filter(Bundle* bundle)
2416e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{
2417e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    ResourceFilter reqFilter;
2418e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    status_t err = reqFilter.parse(bundle->getConfigurations());
2419e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (err != NO_ERROR) {
2420e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return err;
2421e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2422e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2423e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    ResourceFilter prefFilter;
2424e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    err = prefFilter.parse(bundle->getPreferredConfigurations());
2425e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (err != NO_ERROR) {
2426e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return err;
2427e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2428e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2429e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    if (reqFilter.isEmpty() && prefFilter.isEmpty()) {
2430e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        return NO_ERROR;
2431e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2432e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2433bd9d2bcdebfa66a0f71fa67aa256dcae4ccd93daDianne Hackborn    if (bundle->getVerbose()) {
2434e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (!reqFilter.isEmpty()) {
2435e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("Applying required filter: %s\n",
2436e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle->getConfigurations());
2437e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2438e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (!prefFilter.isEmpty()) {
2439e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            printf("Applying preferred filter: %s\n",
2440e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    bundle->getPreferredConfigurations());
2441e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2442e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2443e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2444e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2445e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t ND = resdirs.size();
2446e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (size_t i=0; i<ND; i++) {
2447e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& dir = resdirs.itemAt(i);
2448e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (dir->getLeaf() == kValuesDir) {
2449e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // The "value" dir is special since a single file defines
2450e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // multiple resources, so we can not do filtering on the
2451e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // files themselves.
2452e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
2453e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2454e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        if (dir->getLeaf() == kMipmapDir) {
2455e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // We also skip the "mipmap" directory, since the point of this
2456e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // is to include all densities without stripping.  If you put
2457e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // other configurations in here as well they won't be stripped
2458e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // either...  So don't do that.  Seriously.  What is wrong with you?
2459e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            continue;
2460e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2461e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2462e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const size_t NG = dir->getFiles().size();
2463e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        for (size_t j=0; j<NG; j++) {
2464e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            sp<AaptGroup> grp = dir->getFiles().valueAt(j);
2465e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2466e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // First remove any configurations we know we don't need.
2467e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            for (size_t k=0; k<grp->getFiles().size(); k++) {
2468e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                sp<AaptFile> file = grp->getFiles().valueAt(k);
2469e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (k == 0 && grp->getFiles().size() == 1) {
2470e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // If this is the only file left, we need to keep it.
2471e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // Otherwise the resource IDs we are using will be inconsistent
2472e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // with what we get when not stripping.  Sucky, but at least
2473e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // for now we can rely on the back-end doing another filtering
2474e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // pass to take this out and leave us with this resource name
2475e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // containing no entries.
2476e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    continue;
2477e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2478e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (file->getPath().getPathExtension() == ".xml") {
2479e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // We can't remove .xml files at this point, because when
2480e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // we parse them they may add identifier resources, so
2481e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // removing them can cause our resource identifiers to
2482e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    // become inconsistent.
2483e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    continue;
2484e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2485e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                const ResTable_config& config(file->getGroupEntry().toParams());
2486e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                if (!reqFilter.match(config)) {
2487e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (bundle->getVerbose()) {
2488e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        printf("Pruning unneeded resource: %s\n",
2489e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                file->getPrintableSource().string());
2490e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2491e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    grp->removeFile(k);
2492e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    k--;
2493e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2494e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2495e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2496e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Quick check: no preferred filters, nothing more to do.
2497e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            if (prefFilter.isEmpty()) {
2498e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                continue;
2499e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2500e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
25019438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // Get the preferred density if there is one. We do not match exactly for density.
25029438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // If our preferred density is hdpi but we only have mdpi and xhdpi resources, we
25039438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            // pick xhdpi.
25049438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            uint32_t preferredDensity = 0;
25059438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            const SortedVector<uint32_t>* preferredConfigs = prefFilter.configsForAxis(AXIS_DENSITY);
25069438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            if (preferredConfigs != NULL && preferredConfigs->size() > 0) {
25079438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                preferredDensity = (*preferredConfigs)[0];
25089438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski            }
25099438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
2510e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            // Now deal with preferred configurations.
2511e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            for (int axis=AXIS_START; axis<=AXIS_END; axis++) {
2512e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                for (size_t k=0; k<grp->getFiles().size(); k++) {
2513e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    sp<AaptFile> file = grp->getFiles().valueAt(k);
2514e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (k == 0 && grp->getFiles().size() == 1) {
2515e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // If this is the only file left, we need to keep it.
2516e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // Otherwise the resource IDs we are using will be inconsistent
2517e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // with what we get when not stripping.  Sucky, but at least
2518e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // for now we can rely on the back-end doing another filtering
2519e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // pass to take this out and leave us with this resource name
2520e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // containing no entries.
2521e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        continue;
2522e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2523e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (file->getPath().getPathExtension() == ".xml") {
2524e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // We can't remove .xml files at this point, because when
2525e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // we parse them they may add identifier resources, so
2526e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // removing them can cause our resource identifiers to
2527e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // become inconsistent.
2528e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        continue;
2529e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2530e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    const ResTable_config& config(file->getGroupEntry().toParams());
2531e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    if (!prefFilter.match(axis, config)) {
2532e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // This is a resource we would prefer not to have.  Check
2533e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // to see if have a similar variation that we would like
2534e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        // to have and, if so, we can drop it.
25359438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
25369438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        uint32_t bestDensity = config.density;
25379438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
2538e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        for (size_t m=0; m<grp->getFiles().size(); m++) {
2539e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            if (m == k) continue;
2540e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            sp<AaptFile> mfile = grp->getFiles().valueAt(m);
2541e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            const ResTable_config& mconfig(mfile->getGroupEntry().toParams());
2542e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) {
25439438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                if (axis == AXIS_DENSITY && preferredDensity > 0) {
25449438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    // See if there is a better density resource
25459438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    if (mconfig.density < bestDensity &&
25469438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            mconfig.density > preferredDensity &&
25479438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            bestDensity > preferredDensity) {
25489438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // This density is between our best density and
25499438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // the preferred density, therefore it is better.
25509438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        bestDensity = mconfig.density;
25519438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    } else if (mconfig.density > bestDensity &&
25529438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                            bestDensity < preferredDensity) {
25539438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // This density is better than our best density and
25549438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // our best density was smaller than our preferred
25559438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        // density, so it is better.
25569438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        bestDensity = mconfig.density;
25579438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                    }
25589438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                } else if (prefFilter.match(axis, mconfig)) {
2559e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    if (bundle->getVerbose()) {
2560e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                        printf("Pruning unneeded resource: %s\n",
2561e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                                file->getPrintableSource().string());
2562e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    }
2563e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    grp->removeFile(k);
2564e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    k--;
2565e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                    break;
2566e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                                }
2567e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                            }
2568e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                        }
25699438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski
25709438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        if (axis == AXIS_DENSITY && preferredDensity > 0 &&
25719438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                bestDensity != config.density) {
25729438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            if (bundle->getVerbose()) {
25739438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                printf("Pruning unneeded resource: %s\n",
25749438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                                        file->getPrintableSource().string());
25759438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            }
25769438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            grp->removeFile(k);
25779438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                            k--;
25789438c2df133710ea2364e817cfd237f7a3d69ab1Adam Lesinski                        }
2579e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                    }
2580e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                }
2581e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn            }
2582e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        }
2583e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
2584e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2585e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    return NO_ERROR;
2586e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn}
2587e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name)
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AaptSymbols> sym = mSymbols.valueFor(name);
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sym == NULL) {
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sym = new AaptSymbols();
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSymbols.add(name, sym);
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sym;
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25981644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornsp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
25991644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
26001644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
26011644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (sym == NULL) {
26021644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        sym = new AaptSymbols();
26031644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        mJavaSymbols.add(name, sym);
26041644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
26051644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return sym;
26061644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
26071644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
26081644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptAssets::applyJavaSymbols()
26091644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{
26101644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    size_t N = mJavaSymbols.size();
26111644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    for (size_t i=0; i<N; i++) {
26121644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const String8& name = mJavaSymbols.keyAt(i);
26131644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
26141644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        ssize_t pos = mSymbols.indexOfKey(name);
26151644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (pos < 0) {
26161644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            SourcePos pos;
26171644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            pos.error("Java symbol dir %s not defined\n", name.string());
26181644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            return UNKNOWN_ERROR;
26191644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
26201644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        //printf("**** applying java symbols in dir %s\n", name.string());
26211644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
26221644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        if (err != NO_ERROR) {
26231644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn            return err;
26241644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn        }
26251644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    }
26261644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
26271644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return NO_ERROR;
26281644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
26291644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
26301644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornbool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
26311644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
26321644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //        sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
26331644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    //        sym.isJavaSymbol ? 1 : 0);
26341644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (!mHavePrivateSymbols) return true;
26351644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (sym.isPublic) return true;
26361644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    if (includePrivate && sym.isJavaSymbol) return true;
26371644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn    return false;
26381644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn}
26391644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::buildIncludedResources(Bundle* bundle)
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!mHaveIncludedAssets) {
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add in all includes.
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const Vector<const char*>& incl = bundle->getPackageIncludes();
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const size_t N=incl.size();
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (size_t i=0; i<N; i++) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bundle->getVerbose())
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                printf("Including resources from package: %s\n", incl[i]);
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) {
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr, "ERROR: Asset package include '%s' not found.\n",
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        incl[i]);
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return UNKNOWN_ERROR;
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveIncludedAssets = true;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::addIncludedResources(const sp<AaptFile>& file)
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res = getIncludedResources();
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX dirty!
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return const_cast<ResTable&>(res).add(file->getData(), file->getSize(), NULL);
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst ResTable& AaptAssets::getIncludedResources() const
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mIncludedAssets.getResources(false);
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2673e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptAssets::print(const String8& prefix) const
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2675e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    String8 innerPrefix(prefix);
2676e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    innerPrefix.append("  ");
2677e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    String8 innerInnerPrefix(innerPrefix);
2678e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    innerInnerPrefix.append("  ");
2679e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("%sConfigurations:\n", prefix.string());
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N=mGroupEntries.size();
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
2682e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        String8 cname = mGroupEntries.itemAt(i).toDirName(String8());
2683e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        printf("%s %s\n", prefix.string(),
2684e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn                cname != "" ? cname.string() : "(default)");
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2687e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("\n%sFiles:\n", prefix.string());
2688e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    AaptDir::print(innerPrefix);
2689e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn
2690e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    printf("\n%sResource Dirs:\n", prefix.string());
2691e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2692e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t NR = resdirs.size();
2693e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    for (size_t i=0; i<NR; i++) {
2694e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& d = resdirs.itemAt(i);
2695e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        printf("%s  Type %s\n", prefix.string(), d->getLeaf().string());
2696e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        d->print(innerInnerPrefix);
2697e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    }
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2700e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornsp<AaptDir> AaptAssets::resDir(const String8& name) const
27011553c82e084ac5763fb393857224145506771b99Joe Onorato{
2702e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const Vector<sp<AaptDir> >& resdirs = mResDirs;
2703e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn    const size_t N = resdirs.size();
27041553c82e084ac5763fb393857224145506771b99Joe Onorato    for (size_t i=0; i<N; i++) {
2705e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn        const sp<AaptDir>& d = resdirs.itemAt(i);
27061553c82e084ac5763fb393857224145506771b99Joe Onorato        if (d->getLeaf() == name) {
27071553c82e084ac5763fb393857224145506771b99Joe Onorato            return d;
27081553c82e084ac5763fb393857224145506771b99Joe Onorato        }
27091553c82e084ac5763fb393857224145506771b99Joe Onorato    }
27101553c82e084ac5763fb393857224145506771b99Joe Onorato    return NULL;
27111553c82e084ac5763fb393857224145506771b99Joe Onorato}
27121553c82e084ac5763fb393857224145506771b99Joe Onorato
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvalid_symbol_name(const String8& symbol)
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static char const * const KEYWORDS[] = {
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "abstract", "assert", "boolean", "break",
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "byte", "case", "catch", "char", "class", "const", "continue",
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "default", "do", "double", "else", "enum", "extends", "final",
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "finally", "float", "for", "goto", "if", "implements", "import",
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "instanceof", "int", "interface", "long", "native", "new", "package",
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "private", "protected", "public", "return", "short", "static",
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "strictfp", "super", "switch", "synchronized", "this", "throw",
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "throws", "transient", "try", "void", "volatile", "while",
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "true", "false", "null",
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NULL
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char*const* k = KEYWORDS;
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char*const s = symbol.string();
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*k) {
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (0 == strcmp(s, *k)) {
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        k++;
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2738