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