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