19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AaptAssets.h" 6e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#include "ResourceFilter.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Main.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h> 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <dirent.h> 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h> 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kDefaultLocale = "default"; 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kWildcardName = "any"; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kAssetDir = "assets"; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kResourceDir = "res"; 20e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kValuesDir = "values"; 21e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatic const char* kMipmapDir = "mipmap"; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* kInvalidChars = "/\\:"; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const size_t kMaxAssetFileName = 100; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const String8 kResString(kResourceDir); 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Names of asset files must meet the following criteria: 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - the filename length must be less than kMaxAssetFileName bytes long 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (and can't be empty) 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - all characters must be 7-bit printable ASCII 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - none of { '/' '\\' ':' } 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass in just the filename, not the full path. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool validateFileName(const char* fileName) 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* cp = fileName; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len = 0; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*cp != '\0') { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((*cp & 0x80) != 0) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; // reject high ASCII 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*cp < 0x20 || *cp >= 0x7f) 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; // reject control chars and 0x7f 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strchr(kInvalidChars, *cp) != NULL) 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; // reject path sep chars 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cp++; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len++; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len < 1 || len > kMaxAssetFileName) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; // reject empty or too long 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 596c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The default to use if no other ignore pattern is defined. 606c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * const gDefaultIgnoreAssets = 61e0219c8baa9d63b3794f90ab772f1c19ecb74ec4Tor Norbye "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"; 626c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll// The ignore pattern that can be passed via --ignore-assets in Main.cpp 636c255a3a378143af59021d29b4980b28f1ab4544Raphael Mollconst char * gUserIgnoreAssets = NULL; 646c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool isHidden(const char *root, const char *path) 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 676c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // Patterns syntax: 686c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - Delimiter is : 696c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - Entry can start with the flag ! to avoid printing a warning 706c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // about the file being ignored. 716c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - Entry can have the flag "<dir>" to match only directories 726c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // or <file> to match only files. Default is to match both. 736c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - Entry can be a simplified glob "<prefix>*" or "*<suffix>" 746c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // where prefix/suffix must have at least 1 character (so that 756c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // we don't match a '*' catch-all pattern.) 766c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - The special filenames "." and ".." are always ignored. 776c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - Otherwise the full string is matched. 786c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // - match is not case-sensitive. 796c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 806c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) { 816c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll return true; 826c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 836c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 846c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll const char *delim = ":"; 856c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll const char *p = gUserIgnoreAssets; 866c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (!p || !p[0]) { 876c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll p = getenv("ANDROID_AAPT_IGNORE"); 886c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 896c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (!p || !p[0]) { 906c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll p = gDefaultIgnoreAssets; 916c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 926c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll char *patterns = strdup(p); 936c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 946c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll bool ignore = false; 956c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll bool chatty = true; 966c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll char *matchedPattern = NULL; 976c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 986c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll String8 fullPath(root); 996c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll fullPath.appendPath(path); 1006c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll FileType type = getFileType(fullPath); 1016c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 1026c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll int plen = strlen(path); 1036c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 1046c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // Note: we don't have strtok_r under mingw. 1056c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll for(char *token = strtok(patterns, delim); 1066c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll !ignore && token != NULL; 1076c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll token = strtok(NULL, delim)) { 1086c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll chatty = token[0] != '!'; 1096c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (!chatty) token++; // skip ! 1106c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (strncasecmp(token, "<dir>" , 5) == 0) { 1116c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (type != kFileTypeDirectory) continue; 1126c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll token += 5; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1146c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (strncasecmp(token, "<file>", 6) == 0) { 1156c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (type != kFileTypeRegular) continue; 1166c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll token += 6; 1176c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 1186c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 1196c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll matchedPattern = token; 1206c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll int n = strlen(token); 1216c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll 1226c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (token[0] == '*') { 1236c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // Match *suffix 1246c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll token++; 125996b073e813ba1a22a13282ccdebb664f14ba898Ying Wang n--; 1266c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (n <= plen) { 1276c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll ignore = strncasecmp(token, path + plen - n, n) == 0; 1286c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 1296c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } else if (n > 1 && token[n - 1] == '*') { 1306c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll // Match prefix* 1316c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll ignore = strncasecmp(token, path, n - 1) == 0; 1326c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } else { 1336c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll ignore = strcasecmp(token, path) == 0; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1376c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll if (ignore && chatty) { 1386c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll fprintf(stderr, " (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n", 1396c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll type == kFileTypeDirectory ? "dir" : "file", 1406c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll path, 1416c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll matchedPattern ? matchedPattern : ""); 1426c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1446c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll free(patterns); 1456c255a3a378143af59021d29b4980b28f1ab4544Raphael Moll return ignore; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config config; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IMSI - MCC 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getMccName(part.string(), &config)) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_MCC; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.mcc; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IMSI - MNC 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getMncName(part.string(), &config)) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_MNC; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.mnc; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // locale - language 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_LANGUAGE; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = part[1] << 8 | part[0]; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // locale - language_REGION 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (part.length() == 5 && isalpha(part[0]) && isalpha(part[1]) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && part[2] == '_' && isalpha(part[3]) && isalpha(part[4])) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_LANGUAGE; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = (part[4] << 24) | (part[3] << 16) | (part[1] << 8) | (part[0]); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1865f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // layout direction 1875f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (getLayoutDirectionName(part.string(), &config)) { 1885f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio *axis = AXIS_LAYOUTDIR; 1895f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio *value = (config.screenLayout&ResTable_config::MASK_LAYOUTDIR); 1905f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return 0; 1915f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 1925f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 19369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // smallest screen dp width 19469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getSmallestScreenWidthDpName(part.string(), &config)) { 19569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *axis = AXIS_SMALLESTSCREENWIDTHDP; 19669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *value = config.smallestScreenWidthDp; 197c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return 0; 198c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 199c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 200ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn // screen dp width 201ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (getScreenWidthDpName(part.string(), &config)) { 202ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn *axis = AXIS_SCREENWIDTHDP; 203ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn *value = config.screenWidthDp; 204ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return 0; 205ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 206ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 207ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn // screen dp height 208ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (getScreenHeightDpName(part.string(), &config)) { 209ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn *axis = AXIS_SCREENHEIGHTDP; 210ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn *value = config.screenHeightDp; 211ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return 0; 212ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 213ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 21469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // screen layout size 21569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenLayoutSizeName(part.string(), &config)) { 21669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *axis = AXIS_SCREENLAYOUTSIZE; 21769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE); 21869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return 0; 21969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 22069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 22169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // screen layout long 22269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenLayoutLongName(part.string(), &config)) { 22369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *axis = AXIS_SCREENLAYOUTLONG; 22469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG); 22569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return 0; 22669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 22769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // orientation 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getOrientationName(part.string(), &config)) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_ORIENTATION; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.orientation; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel // ui mode type 23627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (getUiModeTypeName(part.string(), &config)) { 23727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel *axis = AXIS_UIMODETYPE; 23827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel *value = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE); 23927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return 0; 24027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 24127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 24227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel // ui mode night 24327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (getUiModeNightName(part.string(), &config)) { 24427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel *axis = AXIS_UIMODENIGHT; 24527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel *value = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT); 24627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return 0; 24727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 24827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // density 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getDensityName(part.string(), &config)) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_DENSITY; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.density; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // touchscreen 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getTouchscreenName(part.string(), &config)) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_TOUCHSCREEN; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.touchscreen; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keyboard hidden 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getKeysHiddenName(part.string(), &config)) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_KEYSHIDDEN; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.inputFlags; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keyboard 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getKeyboardName(part.string(), &config)) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_KEYBOARD; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.keyboard; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn // navigation hidden 27893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (getNavHiddenName(part.string(), &config)) { 27993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn *axis = AXIS_NAVHIDDEN; 28093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn *value = config.inputFlags; 28193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn return 0; 28293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 28393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // navigation 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getNavigationName(part.string(), &config)) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_NAVIGATION; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.navigation; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // screen size 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getScreenSizeName(part.string(), &config)) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_SCREENSIZE; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.screenSize; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // version 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVersionName(part.string(), &config)) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *axis = AXIS_VERSION; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = config.version; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 308e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornuint32_t 309e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::getConfigValueForAxis(const ResTable_config& config, int axis) 310e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 311e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn switch (axis) { 312e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_MCC: 313e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.mcc; 314e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_MNC: 315e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.mnc; 316e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_LANGUAGE: 317e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return (((uint32_t)config.country[1]) << 24) | (((uint32_t)config.country[0]) << 16) 318e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn | (((uint32_t)config.language[1]) << 8) | (config.language[0]); 3195f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio case AXIS_LAYOUTDIR: 3205f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return config.screenLayout&ResTable_config::MASK_LAYOUTDIR; 321e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_SCREENLAYOUTSIZE: 322e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.screenLayout&ResTable_config::MASK_SCREENSIZE; 323e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_ORIENTATION: 324e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.orientation; 325e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_UIMODETYPE: 326e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE); 327e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_UIMODENIGHT: 328e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT); 329e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_DENSITY: 330e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.density; 331e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_TOUCHSCREEN: 332e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.touchscreen; 333e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_KEYSHIDDEN: 334e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.inputFlags; 335e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_KEYBOARD: 336e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.keyboard; 337e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_NAVIGATION: 338e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.navigation; 339e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_SCREENSIZE: 340e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.screenSize; 341e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_SMALLESTSCREENWIDTHDP: 342e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.smallestScreenWidthDp; 343e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_SCREENWIDTHDP: 344e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.screenWidthDp; 345e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_SCREENHEIGHTDP: 346e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.screenHeightDp; 347e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn case AXIS_VERSION: 348e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return config.version; 349e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 350e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return 0; 351e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 352e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 353e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 354e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptGroupEntry::configSameExcept(const ResTable_config& config, 355e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const ResTable_config& otherConfig, int axis) 356e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 357e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=AXIS_START; i<=AXIS_END; i++) { 358e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (i == axis) { 359e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 360e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 361e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (getConfigValueForAxis(config, i) != getConfigValueForAxis(otherConfig, i)) { 362e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return false; 363e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 364e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 365e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 366e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 367e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::initFromDirName(const char* dir, String8* resType) 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 371e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mParamsChanged = true; 372e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<String8> parts; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 375c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den; 3765f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio String8 touch, key, keysHidden, nav, navHidden, size, layoutDir, vers; 37769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *p = dir; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *q; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NULL != (q = strchr(p, '-'))) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 val(p, q-p); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val.toLower(); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parts.add(val); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("part: %s\n", parts[parts.size()-1].string()); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = q+1; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 val(p); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val.toLower(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parts.add(val); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("part: %s\n", parts[parts.size()-1].string()); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int N = parts.size(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 0; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 part = parts[index]; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // resource type 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isValidResourceType(part)) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *resType = part; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // imsi - mcc 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getMccName(part.string())) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mcc = part; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not mcc: %s\n", part.string()); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // imsi - mnc 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getMncName(part.string())) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mnc = part; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not mcc: %s\n", part.string()); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // locale - language 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (part.length() == 2 && isalpha(part[0]) && isalpha(part[1])) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loc = part; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not language: %s\n", part.string()); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // locale - region 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loc.length() > 0 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && part.length() == 3 && part[0] == 'r' && part[0] && part[1]) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loc += "-"; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part.toUpper(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project loc += part.string() + 1; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not region: %s\n", part.string()); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4645f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (getLayoutDirectionName(part.string())) { 4655f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio layoutDir = part; 4665f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 4675f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio index++; 4685f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (index == N) { 4695f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio goto success; 4705f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 4715f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio part = parts[index]; 4725f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } else { 4735f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio //printf("not layout direction: %s\n", part.string()); 4745f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 4755f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 47669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getSmallestScreenWidthDpName(part.string())) { 47769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn smallestwidthdp = part; 478c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 479c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn index++; 480c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (index == N) { 481c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn goto success; 482c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 483c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn part = parts[index]; 484c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 48569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn //printf("not smallest screen width dp: %s\n", part.string()); 486c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 487c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 48869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenWidthDpName(part.string())) { 48969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn widthdp = part; 490c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 491c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn index++; 492c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (index == N) { 493c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn goto success; 494c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 495c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn part = parts[index]; 496c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 49769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn //printf("not screen width dp: %s\n", part.string()); 498c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 499c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 50069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenHeightDpName(part.string())) { 50169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn heightdp = part; 502ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 503ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn index++; 504ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (index == N) { 505ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn goto success; 506ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 507ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn part = parts[index]; 508ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } else { 50969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn //printf("not screen height dp: %s\n", part.string()); 510ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 511ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 51269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenLayoutSizeName(part.string())) { 51369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn layoutsize = part; 514ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 515ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn index++; 516ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (index == N) { 517ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn goto success; 518ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 519ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn part = parts[index]; 520ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } else { 52169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn //printf("not screen layout size: %s\n", part.string()); 52269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 52369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 52469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (getScreenLayoutLongName(part.string())) { 52569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn layoutlong = part; 52669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 52769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn index++; 52869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (index == N) { 52969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn goto success; 53069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 53169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn part = parts[index]; 53269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 53369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn //printf("not screen layout long: %s\n", part.string()); 534ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 535ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // orientation 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getOrientationName(part.string())) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orient = part; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not orientation: %s\n", part.string()); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel // ui mode type 55027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (getUiModeTypeName(part.string())) { 55127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel uiModeType = part; 55227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 55327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel index++; 55427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (index == N) { 55527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel goto success; 55627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 55727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel part = parts[index]; 55827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } else { 55927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel //printf("not ui mode type: %s\n", part.string()); 56027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 56127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 56227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel // ui mode night 56327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (getUiModeNightName(part.string())) { 56427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel uiModeNight = part; 56527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 56627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel index++; 56727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (index == N) { 56827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel goto success; 56927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 57027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel part = parts[index]; 57127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } else { 57227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel //printf("not ui mode night: %s\n", part.string()); 57327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 57427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // density 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getDensityName(part.string())) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project den = part; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not density: %s\n", part.string()); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // touchscreen 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getTouchscreenName(part.string())) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project touch = part; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not touchscreen: %s\n", part.string()); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keyboard hidden 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getKeysHiddenName(part.string())) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keysHidden = part; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not keysHidden: %s\n", part.string()); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keyboard 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getKeyboardName(part.string())) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project key = part; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not keyboard: %s\n", part.string()); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn // navigation hidden 62893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (getNavHiddenName(part.string())) { 62993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn navHidden = part; 63093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 63193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn index++; 63293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (index == N) { 63393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn goto success; 63493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 63593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn part = parts[index]; 63693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } else { 63793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn //printf("not navHidden: %s\n", part.string()); 63893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 63993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getNavigationName(part.string())) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nav = part; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not navigation: %s\n", part.string()); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getScreenSizeName(part.string())) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size = part; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not screen size: %s\n", part.string()); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVersionName(part.string())) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vers = part; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == N) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto success; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project part = parts[index]; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("not version: %s\n", part.string()); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if there are extra parts, it doesn't match 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsuccess: 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->mcc = mcc; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->mnc = mnc; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->locale = loc; 683c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn this->screenLayoutSize = layoutsize; 684c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn this->screenLayoutLong = layoutlong; 68569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn this->smallestScreenWidthDp = smallestwidthdp; 686ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn this->screenWidthDp = widthdp; 687ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn this->screenHeightDp = heightdp; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->orientation = orient; 68927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel this->uiModeType = uiModeType; 69027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel this->uiModeNight = uiModeNight; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->density = den; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->touchscreen = touch; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->keysHidden = keysHidden; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->keyboard = key; 69593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn this->navHidden = navHidden; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->navigation = nav; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->screenSize = size; 6985f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio this->layoutDirection = layoutDir; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->version = vers; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // what is this anyway? 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->vendor = ""; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toString() const 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 s = this->mcc; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += this->mnc; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += this->locale; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7165f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio s += layoutDirection; 7175f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio s += ","; 71869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += smallestScreenWidthDp; 719c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn s += ","; 720ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += screenWidthDp; 721ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += ","; 722ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += screenHeightDp; 723ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += ","; 72469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += screenLayoutSize; 72569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += ","; 72669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += screenLayoutLong; 72769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += ","; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += this->orientation; 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 73027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += uiModeType; 73127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += ","; 73227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += uiModeNight; 73327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += ","; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += density; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += touchscreen; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += keysHidden; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += keyboard; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 74293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn s += navHidden; 74393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn s += ","; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += navigation; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += screenSize; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += ","; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += version; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptGroupEntry::toDirName(const String8& resType) const 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 s = resType; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->mcc != "") { 757e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 758e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 759e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += mcc; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->mnc != "") { 763e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 764e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 765e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += mnc; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->locale != "") { 769e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 770e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 771e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += locale; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7745f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (this->layoutDirection != "") { 7755f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (s.length() > 0) { 7765f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio s += "-"; 7775f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 7785f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio s += layoutDirection; 7795f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 78069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (this->smallestScreenWidthDp != "") { 781e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 782e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 783e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 78469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += smallestScreenWidthDp; 785c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 786ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (this->screenWidthDp != "") { 787e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 788e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 789e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 790ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += screenWidthDp; 791ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 792ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (this->screenHeightDp != "") { 793e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 794e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 795e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 796ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn s += screenHeightDp; 797ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 79869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (this->screenLayoutSize != "") { 799e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 800e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 801e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 80269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += screenLayoutSize; 80369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 80469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (this->screenLayoutLong != "") { 805e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 806e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 807e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 80869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn s += screenLayoutLong; 80969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->orientation != "") { 811e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 812e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 813e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += orientation; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (this->uiModeType != "") { 817e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 818e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 819e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 82027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += uiModeType; 82127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 82227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (this->uiModeNight != "") { 823e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 824e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 825e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 82627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel s += uiModeNight; 82727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->density != "") { 829e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 830e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 831e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += density; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->touchscreen != "") { 835e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 836e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 837e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += touchscreen; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->keysHidden != "") { 841e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 842e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 843e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += keysHidden; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->keyboard != "") { 847e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 848e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 849e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += keyboard; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (this->navHidden != "") { 853e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 854e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 855e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 85693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn s += navHidden; 85793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->navigation != "") { 859e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 860e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 861e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += navigation; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->screenSize != "") { 865e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 866e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 867e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += screenSize; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this->version != "") { 871e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (s.length() > 0) { 872e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn s += "-"; 873e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s += version; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMccName(const char* name, 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->mcc = 0; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* c = name; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'm') return false; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'c') return false; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'c') return false; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* val = c; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*c >= '0' && *c <= '9') { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*c != 0) return false; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c-val != 3) return false; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int d = atoi(val); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != 0) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->mcc = d; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getMncName(const char* name, 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->mcc = 0; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* c = name; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'm') return false; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'n') return false; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tolower(*c) != 'c') return false; 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* val = c; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*c >= '0' && *c <= '9') { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*c != 0) return false; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c-val == 0 || c-val > 3) return false; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9355ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig if (out) { 9365ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig out->mnc = atoi(val); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9395ef0b9d72451d4bb65f5a76a05738041ed15664aJohan Redestig return true; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does this directory name fit the pattern of a locale dir ("en-rUS" or 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "default")? 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Should insist that the first two letters are lower case, and the 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second two are upper. 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getLocaleName(const char* fileName, 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(fileName, kWildcardName) == 0 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || strcmp(fileName, kDefaultLocale) == 0) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[0] = 0; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[1] = 0; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[0] = 0; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[1] = 0; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(fileName) == 2 && isalpha(fileName[0]) && isalpha(fileName[1])) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[0] = fileName[0]; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[1] = fileName[1]; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[0] = 0; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[1] = 0; 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(fileName) == 5 && 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isalpha(fileName[0]) && 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isalpha(fileName[1]) && 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileName[2] == '-' && 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isalpha(fileName[3]) && 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isalpha(fileName[4])) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[0] = fileName[0]; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->language[1] = fileName[1]; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[0] = fileName[3]; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->country[1] = fileName[4]; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9915f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Megliobool AaptGroupEntry::getLayoutDirectionName(const char* name, ResTable_config* out) 9925f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio{ 9935f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (strcmp(name, kWildcardName) == 0) { 9945f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (out) out->screenLayout = 9955f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR) 9965f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio | ResTable_config::LAYOUTDIR_ANY; 9975f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return true; 9988a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio } else if (strcmp(name, "ldltr") == 0) { 9995f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (out) out->screenLayout = 10005f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR) 10015f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio | ResTable_config::LAYOUTDIR_LTR; 10025f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return true; 10038a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio } else if (strcmp(name, "ldrtl") == 0) { 10045f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (out) out->screenLayout = 10055f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR) 10065f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio | ResTable_config::LAYOUTDIR_RTL; 10075f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return true; 10085f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 10095f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 10105f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return false; 10115f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio} 10125f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 1013c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutSizeName(const char* name, 1014c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn ResTable_config* out) 1015c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{ 1016c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (strcmp(name, kWildcardName) == 0) { 1017c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1018c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) 1019c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENSIZE_ANY; 1020c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1021c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else if (strcmp(name, "small") == 0) { 1022c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1023c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) 1024c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENSIZE_SMALL; 1025c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1026c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else if (strcmp(name, "normal") == 0) { 1027c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1028c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) 1029c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENSIZE_NORMAL; 1030c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1031c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else if (strcmp(name, "large") == 0) { 1032c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1033c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) 1034c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENSIZE_LARGE; 1035c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 103614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn } else if (strcmp(name, "xlarge") == 0) { 103714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn if (out) out->screenLayout = 103814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) 103914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn | ResTable_config::SCREENSIZE_XLARGE; 104014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn return true; 1041c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 1042c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 1043c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return false; 1044c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn} 1045c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 1046c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackbornbool AaptGroupEntry::getScreenLayoutLongName(const char* name, 1047c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn ResTable_config* out) 1048c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn{ 1049c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (strcmp(name, kWildcardName) == 0) { 1050c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1051c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENLONG) 1052c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENLONG_ANY; 1053c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1054c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else if (strcmp(name, "long") == 0) { 1055c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1056c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENLONG) 1057c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENLONG_YES; 1058c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1059c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else if (strcmp(name, "notlong") == 0) { 1060c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->screenLayout = 1061c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn (out->screenLayout&~ResTable_config::MASK_SCREENLONG) 1062c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn | ResTable_config::SCREENLONG_NO; 1063c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1064c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 1065c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 1066c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return false; 1067c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn} 1068c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getOrientationName(const char* name, 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->orientation = out->ORIENTATION_ANY; 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "port") == 0) { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->orientation = out->ORIENTATION_PORT; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "land") == 0) { 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->orientation = out->ORIENTATION_LAND; 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "square") == 0) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->orientation = out->ORIENTATION_SQUARE; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeTypeName(const char* name, 109027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel ResTable_config* out) 109127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{ 109227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (strcmp(name, kWildcardName) == 0) { 109327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (out) out->uiMode = 109427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) 10957299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn | ResTable_config::UI_MODE_TYPE_ANY; 10967299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn return true; 10977299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn } else if (strcmp(name, "desk") == 0) { 10987299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn if (out) out->uiMode = 10997299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) 11007299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn | ResTable_config::UI_MODE_TYPE_DESK; 110127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return true; 110227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } else if (strcmp(name, "car") == 0) { 110327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (out) out->uiMode = 110427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) 110527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel | ResTable_config::UI_MODE_TYPE_CAR; 110627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return true; 1107e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn } else if (strcmp(name, "television") == 0) { 1108e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn if (out) out->uiMode = 1109e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) 1110e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn | ResTable_config::UI_MODE_TYPE_TELEVISION; 1111e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn return true; 111244fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato } else if (strcmp(name, "appliance") == 0) { 111344fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato if (out) out->uiMode = 111444fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) 111544fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato | ResTable_config::UI_MODE_TYPE_APPLIANCE; 111644fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato return true; 111727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 111827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 111927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return false; 112027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel} 112127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 112227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamelbool AaptGroupEntry::getUiModeNightName(const char* name, 112327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel ResTable_config* out) 112427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel{ 112527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (strcmp(name, kWildcardName) == 0) { 112627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (out) out->uiMode = 112727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) 112827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel | ResTable_config::UI_MODE_NIGHT_ANY; 112927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return true; 113027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } else if (strcmp(name, "night") == 0) { 113127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (out) out->uiMode = 113227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) 113327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel | ResTable_config::UI_MODE_NIGHT_YES; 113427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return true; 113527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } else if (strcmp(name, "notnight") == 0) { 113627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (out) out->uiMode = 113727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) 113827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel | ResTable_config::UI_MODE_NIGHT_NO; 113927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return true; 114027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 114127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 114227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel return false; 114327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel} 114427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getDensityName(const char* name, 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 1149a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_DEFAULT; 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1152a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 1153a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn if (strcmp(name, "nodpi") == 0) { 1154a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_NONE; 1155a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn return true; 1156a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn } 1157a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 1158c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (strcmp(name, "ldpi") == 0) { 1159c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_LOW; 1160c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1161c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 1162c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 1163c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (strcmp(name, "mdpi") == 0) { 1164c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_MEDIUM; 1165c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1166c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 1167c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 1168b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn if (strcmp(name, "tvdpi") == 0) { 1169b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_TV; 1170b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn return true; 1171b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn } 1172b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn 1173c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (strcmp(name, "hdpi") == 0) { 1174c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_HIGH; 1175c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return true; 1176c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 1177d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn 1178588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn if (strcmp(name, "xhdpi") == 0) { 1179d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_XHIGH; 1180588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn return true; 1181588feee5e771de5ec71da213fbb1cba29392c690Dianne Hackborn } 1182d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn 1183d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn if (strcmp(name, "xxhdpi") == 0) { 1184d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_XXHIGH; 1185d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn return true; 1186d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn } 1187d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn 118856a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn if (strcmp(name, "xxxhdpi") == 0) { 118956a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn if (out) out->density = ResTable_config::DENSITY_XXXHIGH; 119056a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn return true; 119156a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn } 119256a2301c7a1169a0692cadaeb48b9a6385d700f5Dianne Hackborn 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* c = (char*)name; 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*c >= '0' && *c <= '9') { 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c++; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check that we have 'dpi' after the last digit. 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (toupper(c[0]) != 'D' || 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project toupper(c[1]) != 'P' || 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project toupper(c[2]) != 'I' || 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c[3] != 0) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // temporarily replace the first letter with \0 to 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use atoi. 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char tmp = c[0]; 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c[0] = '\0'; 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int d = atoi(name); 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c[0] = tmp; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != 0) { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->density = d; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getTouchscreenName(const char* name, 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->touchscreen = out->TOUCHSCREEN_ANY; 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "notouch") == 0) { 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH; 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "stylus") == 0) { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS; 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "finger") == 0) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->touchscreen = out->TOUCHSCREEN_FINGER; 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeysHiddenName(const char* name, 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mask = 0; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t value = 0; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 1248fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root mask = ResTable_config::MASK_KEYSHIDDEN; 1249fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root value = ResTable_config::KEYSHIDDEN_ANY; 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "keysexposed") == 0) { 1251fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root mask = ResTable_config::MASK_KEYSHIDDEN; 1252fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root value = ResTable_config::KEYSHIDDEN_NO; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "keyshidden") == 0) { 1254fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root mask = ResTable_config::MASK_KEYSHIDDEN; 1255fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root value = ResTable_config::KEYSHIDDEN_YES; 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "keyssoft") == 0) { 1257fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root mask = ResTable_config::MASK_KEYSHIDDEN; 1258fedfea24e7de98b4fde13d6f79e6db37d9f0e169Kenny Root value = ResTable_config::KEYSHIDDEN_SOFT; 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mask != 0) { 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->inputFlags = (out->inputFlags&~mask) | value; 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getKeyboardName(const char* name, 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->keyboard = out->KEYBOARD_ANY; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "nokeys") == 0) { 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->keyboard = out->KEYBOARD_NOKEYS; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "qwerty") == 0) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->keyboard = out->KEYBOARD_QWERTY; 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "12key") == 0) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->keyboard = out->KEYBOARD_12KEY; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackbornbool AaptGroupEntry::getNavHiddenName(const char* name, 129093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn ResTable_config* out) 129193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn{ 129293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn uint8_t mask = 0; 129393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn uint8_t value = 0; 129493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (strcmp(name, kWildcardName) == 0) { 1295e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root mask = ResTable_config::MASK_NAVHIDDEN; 1296e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root value = ResTable_config::NAVHIDDEN_ANY; 129793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } else if (strcmp(name, "navexposed") == 0) { 1298e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root mask = ResTable_config::MASK_NAVHIDDEN; 1299e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root value = ResTable_config::NAVHIDDEN_NO; 130093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } else if (strcmp(name, "navhidden") == 0) { 1301e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root mask = ResTable_config::MASK_NAVHIDDEN; 1302e599f78e7785d41902d7525c71d487b36d8ccca2Kenny Root value = ResTable_config::NAVHIDDEN_YES; 130393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 130493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 130593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (mask != 0) { 130693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (out) out->inputFlags = (out->inputFlags&~mask) | value; 130793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn return true; 130893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 130993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 131093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn return false; 131193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn} 131293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool AaptGroupEntry::getNavigationName(const char* name, 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* out) 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->navigation = out->NAVIGATION_ANY; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "nonav") == 0) { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->navigation = out->NAVIGATION_NONAV; 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "dpad") == 0) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->navigation = out->NAVIGATION_DPAD; 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "trackball") == 0) { 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->navigation = out->NAVIGATION_TRACKBALL; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp(name, "wheel") == 0) { 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) out->navigation = out->NAVIGATION_WHEEL; 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1336ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out) 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->screenWidth = out->SCREENWIDTH_ANY; 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->screenHeight = out->SCREENHEIGHT_ANY; 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* x = name; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*x >= '0' && *x <= '9') x++; 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x == name || *x != 'x') return false; 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 xName(name, x-name); 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x++; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* y = x; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*y >= '0' && *y <= '9') y++; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y == name || *y != 0) return false; 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 yName(x, y-x); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t w = (uint16_t)atoi(xName.string()); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t h = (uint16_t)atoi(yName.string()); 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w < h) { 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->screenWidth = w; 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->screenHeight = h; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 137169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackbornbool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out) 137269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn{ 137369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (strcmp(name, kWildcardName) == 0) { 137469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (out) { 137569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn out->smallestScreenWidthDp = out->SCREENWIDTH_ANY; 137669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 137769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return true; 137869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 137969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 138069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (*name != 's') return false; 138169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn name++; 138269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (*name != 'w') return false; 138369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn name++; 138469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn const char* x = name; 138569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn while (*x >= '0' && *x <= '9') x++; 138669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false; 138769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn String8 xName(name, x-name); 138869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 138969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (out) { 139069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn out->smallestScreenWidthDp = (uint16_t)atoi(xName.string()); 139169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 139269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 139369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return true; 139469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn} 139569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 1396ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out) 1397ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{ 1398ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (strcmp(name, kWildcardName) == 0) { 1399ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (out) { 1400ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn out->screenWidthDp = out->SCREENWIDTH_ANY; 1401ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1402ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return true; 1403ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1404ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1405ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (*name != 'w') return false; 1406ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn name++; 1407ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn const char* x = name; 1408ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn while (*x >= '0' && *x <= '9') x++; 1409ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false; 1410ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn String8 xName(name, x-name); 1411ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1412ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (out) { 1413ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn out->screenWidthDp = (uint16_t)atoi(xName.string()); 1414ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1415ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1416ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return true; 1417ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn} 1418ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1419ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out) 1420ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn{ 1421ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (strcmp(name, kWildcardName) == 0) { 1422ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (out) { 1423ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn out->screenHeightDp = out->SCREENWIDTH_ANY; 1424ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1425ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return true; 1426ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1427ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1428ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (*name != 'h') return false; 1429ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn name++; 1430ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn const char* x = name; 1431ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn while (*x >= '0' && *x <= '9') x++; 1432ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false; 1433ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn String8 xName(name, x-name); 1434ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1435ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (out) { 1436ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn out->screenHeightDp = (uint16_t)atoi(xName.string()); 1437ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1438ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1439ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn return true; 1440ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn} 1441ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 1442ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackbornbool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out) 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(name, kWildcardName) == 0) { 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->sdkVersion = out->SDKVERSION_ANY; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->minorVersion = out->MINORVERSION_ANY; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*name != 'v') { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name++; 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* s = name; 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*s >= '0' && *s <= '9') s++; 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == name || *s != 0) return false; 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 sdkName(name, s-name); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out) { 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->sdkVersion = (uint16_t)atoi(sdkName.string()); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out->minorVersion = 0; 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint AaptGroupEntry::compare(const AaptGroupEntry& o) const 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int v = mcc.compare(o.mcc); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = mnc.compare(o.mnc); 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = locale.compare(o.locale); 14755f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (v == 0) v = layoutDirection.compare(o.layoutDirection); 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = vendor.compare(o.vendor); 147769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp); 1478ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (v == 0) v = screenWidthDp.compare(o.screenWidthDp); 1479ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (v == 0) v = screenHeightDp.compare(o.screenHeightDp); 148069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize); 148169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong); 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = orientation.compare(o.orientation); 148327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (v == 0) v = uiModeType.compare(o.uiModeType); 148427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (v == 0) v = uiModeNight.compare(o.uiModeNight); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = density.compare(o.density); 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = touchscreen.compare(o.touchscreen); 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = keysHidden.compare(o.keysHidden); 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = keyboard.compare(o.keyboard); 148993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (v == 0) v = navHidden.compare(o.navHidden); 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = navigation.compare(o.navigation); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = screenSize.compare(o.screenSize); 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == 0) v = version.compare(o.version); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v; 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1496e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornconst ResTable_config& AaptGroupEntry::toParams() const 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1498e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!mParamsChanged) { 1499e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return mParams; 1500e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 1501e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 1502e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mParamsChanged = false; 1503e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ResTable_config& params(mParams); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(¶ms, 0, sizeof(params)); 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getMccName(mcc.string(), ¶ms); 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getMncName(mnc.string(), ¶ms); 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getLocaleName(locale.string(), ¶ms); 15085f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio getLayoutDirectionName(layoutDirection.string(), ¶ms); 150969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), ¶ms); 1510ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn getScreenWidthDpName(screenWidthDp.string(), ¶ms); 1511ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn getScreenHeightDpName(screenHeightDp.string(), ¶ms); 151269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn getScreenLayoutSizeName(screenLayoutSize.string(), ¶ms); 151369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn getScreenLayoutLongName(screenLayoutLong.string(), ¶ms); 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOrientationName(orientation.string(), ¶ms); 151527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel getUiModeTypeName(uiModeType.string(), ¶ms); 151627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel getUiModeNightName(uiModeNight.string(), ¶ms); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getDensityName(density.string(), ¶ms); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getTouchscreenName(touchscreen.string(), ¶ms); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getKeysHiddenName(keysHidden.string(), ¶ms); 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getKeyboardName(keyboard.string(), ¶ms); 152193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn getNavHiddenName(navHidden.string(), ¶ms); 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getNavigationName(navigation.string(), ¶ms); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getScreenSizeName(screenSize.string(), ¶ms); 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVersionName(version.string(), ¶ms); 1525ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn 1526ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn // Fix up version number based on specified parameters. 1527ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn int minSdk = 0; 152869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY 152969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY 1530ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) { 153169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn minSdk = SDK_HONEYCOMB_MR2; 1532ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE) 1533ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn != ResTable_config::UI_MODE_TYPE_ANY 1534ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn || (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT) 1535ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn != ResTable_config::UI_MODE_NIGHT_ANY) { 1536ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn minSdk = SDK_FROYO; 1537ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE) 1538ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn != ResTable_config::SCREENSIZE_ANY 1539ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn || (params.screenLayout&ResTable_config::MASK_SCREENLONG) 1540ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn != ResTable_config::SCREENLONG_ANY 1541ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn || params.density != ResTable_config::DENSITY_DEFAULT) { 1542ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn minSdk = SDK_DONUT; 1543ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } 1544ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn 1545ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn if (minSdk > params.sdkVersion) { 1546ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn params.sdkVersion = minSdk; 1547ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } 1548ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return params; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t size) 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size <= mBufferSize) { 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSize = size; 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mData; 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t allocSize = (size*3)/2; 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* buf = realloc(mData, allocSize); 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buf == NULL) { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mData = buf; 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSize = size; 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = allocSize; 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buf; 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::editData(size_t* outSize) 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outSize) { 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *outSize = mDataSize; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mData; 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* AaptFile::padData(size_t wordSize) 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t extra = mDataSize%wordSize; 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (extra == 0) { 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mData; 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t initial = mDataSize; 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* data = editData(initial+(wordSize-extra)); 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != NULL) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(((uint8_t*)data) + initial, 0, wordSize-extra); 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptFile::writeData(const void* data, size_t size) 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t end = mDataSize; 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t total = size + end; 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* buf = editData(total); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buf == NULL) { 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(((char*)buf)+end, data, size); 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptFile::clearData() 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mData != NULL) free(mData); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mData = NULL; 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSize = 0; 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBufferSize = 0; 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptFile::getPrintableSource() const 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasData()) { 1619e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn String8 name(mGroupEntry.toDirName(String8())); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name.appendPath(mPath); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name.append(" #generated"); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSourceFile; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptGroup::addFile(const sp<AaptFile>& file) 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFiles.indexOfKey(file->getGroupEntry()) < 0) { 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file->mPath = mPath; 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.add(file->getGroupEntry(), file); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#if 0 1640e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("Error adding file %s: group %s already exists in leaf=%s path=%s\n", 1641e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn file->getSourceFile().string(), 1642e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn file->getGroupEntry().toDirName(String8()).string(), 1643e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mLeaf.string(), mPath.string()); 1644e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#endif 1645e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(file->getSourceFile(), -1).error("Duplicate file.\n%s: Original is here.", 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPrintableSource().string()); 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptGroup::removeFile(size_t index) 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.removeItemsAt(index); 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1656e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptGroup::print(const String8& prefix) const 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1658e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%s%s\n", prefix.string(), getPath().string()); 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N=mFiles.size(); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> file = mFiles.valueAt(i); 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const AaptGroupEntry& e = file->getGroupEntry(); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (file->hasData()) { 1665e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%s Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(), 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (int)file->getSize()); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1668e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%s Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(), 1669e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn file->getPrintableSource().string()); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1671e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn //printf("%s File Group Entry: %s\n", prefix.string(), 1672e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // file->getGroupEntry().toDirName(String8()).string()); 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptGroup::getPrintableSource() const 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFiles.size() > 0) { 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Arbitrarily pull the first source file out of the list. 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFiles.valueAt(0)->getPrintableSource(); 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never hit this case, but to be safe... 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getPath(); 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addFile(const String8& name, const sp<AaptGroup>& file) 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFiles.indexOfKey(name) >= 0) { 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ALREADY_EXISTS; 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.add(name, file); 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addDir(const String8& name, const sp<AaptDir>& dir) 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDirs.indexOfKey(name) >= 0) { 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ALREADY_EXISTS; 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.add(name, dir); 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptDir> AaptDir::makeDir(const String8& path) 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name; 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 remain = path; 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> subdir = this; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (name = remain.walkPath(&remain), remain != "") { 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdir = subdir->makeDir(name); 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t i = subdir->mDirs.indexOfKey(name); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= 0) { 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subdir->mDirs.valueAt(i); 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name)); 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdir->mDirs.add(name, dir); 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dir; 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeFile(const String8& name) 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.removeItem(name); 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptDir::removeDir(const String8& name) 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.removeItem(name); 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file) 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptGroup> group; 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFiles.indexOfKey(leafName) >= 0) { 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = mFiles.valueFor(leafName); 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = new AaptGroup(leafName, mPath.appendPathCopy(leafName)); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.add(leafName, group); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return group->addFile(file); 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, 17539bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin const AaptGroupEntry& kind, const String8& resType, 17549bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin sp<FilePathStore>& fullResPaths) 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<String8> fileNames; 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DIR* dir = NULL; 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dir = opendir(srcDir.string()); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dir == NULL) { 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno)); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Slurp the filenames out of the directory. 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (1) { 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct dirent* entry; 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry = readdir(dir); 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entry == NULL) 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHidden(srcDir.string(), entry->d_name)) 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17799bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin String8 name(entry->d_name); 17809bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin fileNames.add(name); 17819bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin // Add fully qualified path for dependency purposes 17829bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin // if we're collecting them 17839bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin if (fullResPaths != NULL) { 17849bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin fullResPaths->add(srcDir.appendPathCopy(name)); 17859bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin } 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closedir(dir); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t count = 0; 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stash away the files and recursively descend into subdirectories. 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = fileNames.size(); 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = 0; i < N; i++) { 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 pathName(srcDir); 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type; 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pathName.appendPath(fileNames[i].string()); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = getFileType(pathName.string()); 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeDirectory) { 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> subdir; 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool notAdded = false; 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDirs.indexOfKey(fileNames[i]) >= 0) { 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdir = mDirs.valueFor(fileNames[i]); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i])); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notAdded = true; 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t res = subdir->slurpFullTree(bundle, pathName, kind, 18139bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin resType, fullResPaths); 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < NO_ERROR) { 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res > 0 && notAdded) { 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.add(fileNames[i], subdir); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += res; 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == kFileTypeRegular) { 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> file = new AaptFile(pathName, kind, resType); 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = addLeafFile(fileNames[i], file); 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count++; 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" (ignoring non-file/dir '%s')\n", pathName.string()); 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptDir::validate() const 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NF = mFiles.size(); 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t ND = mDirs.size(); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = 0; i < NF; i++) { 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) { 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Invalid filename. Unable to add."); 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t j; 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j = i+1; j < NF; j++) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(), 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.valueAt(j)->getLeaf().string()) == 0) { 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File is case-insensitive equivalent to: %s", 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFiles.valueAt(j)->getPrintableSource().string()); 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: if ".gz", check for non-.gz; if non-, check for ".gz" 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (this is mostly caught by the "marked" stuff, below) 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j = 0; j < ND; j++) { 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(), 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.valueAt(j)->getLeaf().string()) == 0) { 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "File conflicts with dir from: %s", 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.valueAt(j)->getPrintableSource().string()); 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = 0; i < ND; i++) { 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) { 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error( 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Invalid directory name, unable to add."); 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t j; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j = i+1; j < ND; j++) { 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(), 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.valueAt(j)->getLeaf().string()) == 0) { 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error( 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Directory is case-insensitive equivalent to: %s", 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDirs.valueAt(j)->getPrintableSource().string()); 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = mDirs.valueAt(i)->validate(); 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1903e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptDir::print(const String8& prefix) const 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t ND=getDirs().size(); 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t i; 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<ND; i++) { 1908e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn getDirs().valueAt(i)->print(prefix); 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t NF=getFiles().size(); 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NF; i++) { 1913e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn getFiles().valueAt(i)->print(prefix); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 AaptDir::getPrintableSource() const 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFiles.size() > 0) { 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Arbitrarily pull the first file out of the list as the source dir. 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFiles.valueAt(0)->getPrintableSource().getPathDir(); 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDirs.size() > 0) { 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Or arbitrarily pull the first dir out of the list as the source dir. 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDirs.valueAt(0)->getPrintableSource().getPathDir(); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never hit this case, but to be safe... 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPath; 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================================= 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19371644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols) 19381644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{ 19391644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn status_t err = NO_ERROR; 19401644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn size_t N = javaSymbols->mSymbols.size(); 19411644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn for (size_t i=0; i<N; i++) { 19421644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const String8& name = javaSymbols->mSymbols.keyAt(i); 19431644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i); 19441644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn ssize_t pos = mSymbols.indexOfKey(name); 19451644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (pos < 0) { 19461644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string()); 19471644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn err = UNKNOWN_ERROR; 19481644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn continue; 19491644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19501644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n", 19511644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn // i, N, name.string(), entry.isJavaSymbol ? 1 : 0); 19521644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol; 19531644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19541644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 19551644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn N = javaSymbols->mNestedSymbols.size(); 19561644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn for (size_t i=0; i<N; i++) { 19571644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const String8& name = javaSymbols->mNestedSymbols.keyAt(i); 19581644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i); 19591644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn ssize_t pos = mNestedSymbols.indexOfKey(name); 19601644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (pos < 0) { 19611644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn SourcePos pos; 19621644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn pos.error("Java symbol dir %s not defined\n", name.string()); 19631644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn err = UNKNOWN_ERROR; 19641644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn continue; 19651644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19661644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn //printf("**** applying java symbols in dir %s\n", name.string()); 19671644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols); 19681644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (myerr != NO_ERROR) { 19691644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn err = myerr; 19701644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19711644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19721644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 19731644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return err; 19741644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn} 19751644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 19761644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// ========================================================================= 19771644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// ========================================================================= 19781644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn// ========================================================================= 19791644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 1980e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornAaptAssets::AaptAssets() 1981e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn : AaptDir(String8(), String8()), 1982e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mChanged(false), mHaveIncludedAssets(false), mRes(NULL) 1983e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 1984e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 1985e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 1986e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornconst SortedVector<AaptGroupEntry>& AaptAssets::getGroupEntries() const { 1987e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (mChanged) { 1988e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 1989e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return mGroupEntries; 1990e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 1991e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 1992e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::addFile(const String8& name, const sp<AaptGroup>& file) 1993e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 1994e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mChanged = true; 1995e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return AaptDir::addFile(name, file); 1996e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 1997e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptFile> AaptAssets::addFile( 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& filePath, const AaptGroupEntry& entry, 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& srcDir, sp<AaptGroup>* outGroup, 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& resType) 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> dir = this; 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptGroup> group; 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> file; 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 root, remain(filePath), partialPath; 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (remain.length() > 0) { 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project root = remain.walkPath(&remain); 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project partialPath.appendPath(root); 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8 rootStr(root); 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (remain.length() == 0) { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t i = dir->getFiles().indexOfKey(rootStr); 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= 0) { 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = dir->getFiles().valueAt(i); 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project group = new AaptGroup(rootStr, filePath); 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t res = dir->addFile(rootStr, group); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NO_ERROR) { 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t res = group->addFile(file); 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NO_ERROR) { 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t i = dir->getDirs().indexOfKey(rootStr); 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= 0) { 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dir = dir->getDirs().valueAt(i); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> subdir = new AaptDir(rootStr, partialPath); 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t res = dir->addDir(rootStr, subdir); 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NO_ERROR) { 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dir = subdir; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupEntries.add(entry); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outGroup) *outGroup = group; 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AaptAssets::addResource(const String8& leafName, const String8& path, 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AaptFile>& file, const String8& resType) 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> res = AaptDir::makeDir(kResString); 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 dirname = file->getGroupEntry().toDirName(resType); 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> subdir = res->makeDir(dirname); 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptGroup> grr = new AaptGroup(leafName, path); 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project grr->addFile(file); 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdir->addFile(leafName, grr); 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFromArgs(Bundle* bundle) 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count; 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int totalCount = 0; 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type; 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<const char *>& resDirs = bundle->getResourceSourceDirs(); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t dirCount =resDirs.size(); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptAssets> current = this; 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int N = bundle->getFileSpecCount(); 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a package manifest was specified, include that first. 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getAndroidManifestFile() != NULL) { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // place at root of zip. 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 srcFile(bundle->getAndroidManifestFile()); 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(), 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NULL, String8()); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount++; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a directory of custom assets was supplied, slurp 'em up. 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getAssetSourceDir()) { 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* assetDir = bundle->getAssetSourceDir(); 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type = getFileType(assetDir); 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeNonexistent) { 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: asset directory '%s' does not exist\n", assetDir); 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != kFileTypeDirectory) { 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir); 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 assetRoot(assetDir); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir)); 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AaptGroupEntry group; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = assetAaptDir->slurpFullTree(bundle, assetRoot, group, 210603589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin String8(), mFullAssetPaths); 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count < 0) { 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount = count; 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0) { 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupEntries.add(group); 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount += count; 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Found %d custom asset file%s in %s\n", 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count, (count==1) ? "" : "s", assetDir); 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a directory of resource-specific assets was supplied, slurp 'em up. 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<dirCount; i++) { 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *res = resDirs[i]; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res) { 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = getFileType(res); 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeNonexistent) { 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res); 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeDirectory) { 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i>0) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptAssets> nextOverlay = new AaptAssets(); 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current->setOverlay(nextOverlay); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current = nextOverlay; 21379bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin current->setFullResPaths(mFullResPaths); 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = current->slurpResourceTree(bundle, String8(res)); 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count < 0) { 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount = count; 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount += count; 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: '%s' is not a directory\n", res); 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Now do any additional raw files. 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int arg=0; arg<N; arg++) { 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* assetDir = bundle->getFileSpecEntry(arg); 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type = getFileType(assetDir); 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeNonexistent) { 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: input directory '%s' does not exist\n", assetDir); 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != kFileTypeDirectory) { 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: '%s' is not a directory\n", assetDir); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 assetRoot(assetDir); 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Processing raw dir '%s'\n", (const char*) assetDir); 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Do a recursive traversal of subdir tree. We don't make any 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * guarantees about ordering, so we're okay with an inorder search 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using whatever order the OS happens to hand back to us. 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 218003589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths); 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count < 0) { 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* failure; report error and remove archive */ 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount = count; 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount += count; 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Found %d asset file%s in %s\n", 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count, (count==1) ? "" : "s", assetDir); 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = validate(); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count != NO_ERROR) { 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCount = count; 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn count = filter(bundle); 2200e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (count != NO_ERROR) { 2201e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn totalCount = count; 2202e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn goto bail; 2203e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return totalCount; 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir, 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const AaptGroupEntry& kind, 22119bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin const String8& resType, 22129bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin sp<FilePathStore>& fullResPaths) 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22149bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths); 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res > 0) { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupEntries.add(kind); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t err = 0; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DIR* dir = opendir(srcDir.string()); 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dir == NULL) { 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno)); 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t count = 0; 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Run through the directory, looking for dirs that match the 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expected pattern. 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (1) { 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct dirent* entry = readdir(dir); 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entry == NULL) { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHidden(srcDir.string(), entry->d_name)) { 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 subdirName(srcDir); 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project subdirName.appendPath(entry->d_name); 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AaptGroupEntry group; 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 resType; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool b = group.initFromDirName(entry->d_name, &resType); 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!b) { 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "invalid resource directory name: %s/%s\n", srcDir.string(), 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry->d_name); 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = -1; 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2261e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) { 2262588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick int maxResInt = atoi(bundle->getMaxResVersion()); 2263e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const char *verString = group.getVersionString().string(); 2264588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick int dirVersionInt = atoi(verString + 1); // skip 'v' in version name 2265588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick if (dirVersionInt > maxResInt) { 2266588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name); 2267588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick continue; 2268588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick } 2269588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick } 2270588f228d6a3e3b254fbc1f13f29ee47e13a669c1Ficus Kirkpatrick 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type = getFileType(subdirName.string()); 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == kFileTypeDirectory) { 2274e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptDir> dir = makeDir(resType); 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t res = dir->slurpFullTree(bundle, subdirName, group, 22769bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin resType, mFullResPaths); 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = res; 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res > 0) { 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupEntries.add(group); 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += res; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2286e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // Only add this directory if we don't already have a resource dir 2287e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // for the current type. This ensures that we only add the dir once 2288e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // for all configs. 2289e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptDir> rdir = resDir(resType); 2290e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (rdir == NULL) { 2291e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mResDirs.add(dir); 2292e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) { 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, " (ignoring file '%s')\n", subdirName.string()); 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closedir(dir); 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dir = NULL; 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAaptAssets::slurpResourceZip(Bundle* bundle, const char* filename) 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AaptGroupEntry> entries; 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip = new ZipFile; 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = zip->open(filename, ZipFile::kOpenReadOnly); 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "error opening zip file %s\n", filename); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = err; 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int N = zip->getNumEntries(); 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipEntry* entry = zip->getEntryByIndex(i); 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entry->getDeleted()) { 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 entryName(entry->getFileName()); 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 dirName = entryName.getPathDir(); 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName); 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 resType; 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AaptGroupEntry kind; 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 remain; 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entryName.walkPath(&remain) == kResourceDir) { 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these are the resources, pull their type out of the directory name 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kind.initFromDirName(remain.walkPath().string(), &resType); 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these are untyped and don't have an AaptGroupEntry 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entries.indexOf(kind) < 0) { 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entries.add(kind); 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupEntries.add(kind); 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use the one from the zip file if they both exist. 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dir->removeFile(entryName.getPathLeaf()); 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptFile> file = new AaptFile(entryName, kind, resType); 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = dir->addLeafFile(entryName.getPathLeaf(), file); 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string()); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = err; 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file->setCompressionMethod(entry->getCompressionMethod()); 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entryName == "AndroidManifest.xml") { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("AndroidManifest.xml\n"); 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\n\nfile: %s\n", entryName.string()); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len = entry->getUncompressedLen(); 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* data = zip->uncompress(entry); 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* buf = file->editData(len); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(buf, data, len); 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int OFF = 0; 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const unsigned char* p = (unsigned char*)data; 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const unsigned char* end = p+len; 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p += OFF; 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<32 && p < end; i++) { 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("0x%03x ", i*0x10 + OFF); 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<0x10 && p < end; j++) { 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" %02x", *p); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p++; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\n"); 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free(data); 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count++; 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2401e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t AaptAssets::filter(Bundle* bundle) 2402e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 2403e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ResourceFilter reqFilter; 2404e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn status_t err = reqFilter.parse(bundle->getConfigurations()); 2405e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (err != NO_ERROR) { 2406e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return err; 2407e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2408e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2409e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ResourceFilter prefFilter; 2410e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn err = prefFilter.parse(bundle->getPreferredConfigurations()); 2411e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (err != NO_ERROR) { 2412e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return err; 2413e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2414e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2415e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (reqFilter.isEmpty() && prefFilter.isEmpty()) { 2416e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NO_ERROR; 2417e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2418e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2419bd9d2bcdebfa66a0f71fa67aa256dcae4ccd93daDianne Hackborn if (bundle->getVerbose()) { 2420e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!reqFilter.isEmpty()) { 2421e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("Applying required filter: %s\n", 2422e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn bundle->getConfigurations()); 2423e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2424e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!prefFilter.isEmpty()) { 2425e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("Applying preferred filter: %s\n", 2426e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn bundle->getPreferredConfigurations()); 2427e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2428e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2429e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2430e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const Vector<sp<AaptDir> >& resdirs = mResDirs; 2431e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const size_t ND = resdirs.size(); 2432e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t i=0; i<ND; i++) { 2433e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const sp<AaptDir>& dir = resdirs.itemAt(i); 2434e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (dir->getLeaf() == kValuesDir) { 2435e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // The "value" dir is special since a single file defines 2436e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // multiple resources, so we can not do filtering on the 2437e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // files themselves. 2438e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2439e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2440e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (dir->getLeaf() == kMipmapDir) { 2441e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // We also skip the "mipmap" directory, since the point of this 2442e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // is to include all densities without stripping. If you put 2443e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // other configurations in here as well they won't be stripped 2444e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // either... So don't do that. Seriously. What is wrong with you? 2445e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2446e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2447e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2448e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const size_t NG = dir->getFiles().size(); 2449e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t j=0; j<NG; j++) { 2450e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptGroup> grp = dir->getFiles().valueAt(j); 2451e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2452e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // First remove any configurations we know we don't need. 2453e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t k=0; k<grp->getFiles().size(); k++) { 2454e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptFile> file = grp->getFiles().valueAt(k); 2455e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (k == 0 && grp->getFiles().size() == 1) { 2456e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // If this is the only file left, we need to keep it. 2457e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // Otherwise the resource IDs we are using will be inconsistent 2458e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // with what we get when not stripping. Sucky, but at least 2459e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // for now we can rely on the back-end doing another filtering 2460e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // pass to take this out and leave us with this resource name 2461e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // containing no entries. 2462e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2463e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2464e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (file->getPath().getPathExtension() == ".xml") { 2465e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // We can't remove .xml files at this point, because when 2466e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // we parse them they may add identifier resources, so 2467e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // removing them can cause our resource identifiers to 2468e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // become inconsistent. 2469e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2470e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2471e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const ResTable_config& config(file->getGroupEntry().toParams()); 2472e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!reqFilter.match(config)) { 2473e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (bundle->getVerbose()) { 2474e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("Pruning unneeded resource: %s\n", 2475e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn file->getPrintableSource().string()); 2476e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2477e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn grp->removeFile(k); 2478e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn k--; 2479e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2480e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2481e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2482e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // Quick check: no preferred filters, nothing more to do. 2483e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (prefFilter.isEmpty()) { 2484e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2485e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2486e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2487e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // Now deal with preferred configurations. 2488e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int axis=AXIS_START; axis<=AXIS_END; axis++) { 2489e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t k=0; k<grp->getFiles().size(); k++) { 2490e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptFile> file = grp->getFiles().valueAt(k); 2491e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (k == 0 && grp->getFiles().size() == 1) { 2492e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // If this is the only file left, we need to keep it. 2493e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // Otherwise the resource IDs we are using will be inconsistent 2494e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // with what we get when not stripping. Sucky, but at least 2495e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // for now we can rely on the back-end doing another filtering 2496e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // pass to take this out and leave us with this resource name 2497e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // containing no entries. 2498e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2499e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2500e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (file->getPath().getPathExtension() == ".xml") { 2501e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // We can't remove .xml files at this point, because when 2502e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // we parse them they may add identifier resources, so 2503e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // removing them can cause our resource identifiers to 2504e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // become inconsistent. 2505e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn continue; 2506e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2507e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const ResTable_config& config(file->getGroupEntry().toParams()); 2508e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!prefFilter.match(axis, config)) { 2509e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // This is a resource we would prefer not to have. Check 2510e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // to see if have a similar variation that we would like 2511e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // to have and, if so, we can drop it. 2512e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t m=0; m<grp->getFiles().size(); m++) { 2513e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (m == k) continue; 2514e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sp<AaptFile> mfile = grp->getFiles().valueAt(m); 2515e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const ResTable_config& mconfig(mfile->getGroupEntry().toParams()); 2516e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (AaptGroupEntry::configSameExcept(config, mconfig, axis)) { 2517e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (prefFilter.match(axis, mconfig)) { 2518e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (bundle->getVerbose()) { 2519e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("Pruning unneeded resource: %s\n", 2520e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn file->getPrintableSource().string()); 2521e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2522e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn grp->removeFile(k); 2523e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn k--; 2524e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn break; 2525e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2526e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2527e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2528e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2529e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2530e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2531e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2532e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 2533e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2534e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NO_ERROR; 2535e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 2536e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<AaptSymbols> AaptAssets::getSymbolsFor(const String8& name) 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptSymbols> sym = mSymbols.valueFor(name); 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sym == NULL) { 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sym = new AaptSymbols(); 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSymbols.add(name, sym); 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sym; 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25471644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornsp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name) 25481644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{ 25491644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn sp<AaptSymbols> sym = mJavaSymbols.valueFor(name); 25501644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (sym == NULL) { 25511644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn sym = new AaptSymbols(); 25521644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn mJavaSymbols.add(name, sym); 25531644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 25541644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return sym; 25551644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn} 25561644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 25571644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornstatus_t AaptAssets::applyJavaSymbols() 25581644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn{ 25591644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn size_t N = mJavaSymbols.size(); 25601644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn for (size_t i=0; i<N; i++) { 25611644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const String8& name = mJavaSymbols.keyAt(i); 25621644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i); 25631644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn ssize_t pos = mSymbols.indexOfKey(name); 25641644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (pos < 0) { 25651644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn SourcePos pos; 25661644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn pos.error("Java symbol dir %s not defined\n", name.string()); 25671644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return UNKNOWN_ERROR; 25681644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 25691644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn //printf("**** applying java symbols in dir %s\n", name.string()); 25701644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols); 25711644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (err != NO_ERROR) { 25721644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return err; 25731644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 25741644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 25751644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 25761644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return NO_ERROR; 25771644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn} 25781644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 25791644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackbornbool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const { 25801644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n", 25811644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn // sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0, 25821644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn // sym.isJavaSymbol ? 1 : 0); 25831644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (!mHavePrivateSymbols) return true; 25841644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (sym.isPublic) return true; 25851644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (includePrivate && sym.isJavaSymbol) return true; 25861644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn return false; 25871644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn} 25881644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::buildIncludedResources(Bundle* bundle) 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mHaveIncludedAssets) { 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add in all includes. 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Vector<const char*>& incl = bundle->getPackageIncludes(); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N=incl.size(); 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Including resources from package: %s\n", incl[i]); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIncludedAssets.addAssetPath(String8(incl[i]), NULL)) { 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Asset package include '%s' not found.\n", 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incl[i]); 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UNKNOWN_ERROR; 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveIncludedAssets = true; 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t AaptAssets::addIncludedResources(const sp<AaptFile>& file) 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res = getIncludedResources(); 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX dirty! 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return const_cast<ResTable&>(res).add(file->getData(), file->getSize(), NULL); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst ResTable& AaptAssets::getIncludedResources() const 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIncludedAssets.getResources(false); 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2622e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornvoid AaptAssets::print(const String8& prefix) const 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2624e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn String8 innerPrefix(prefix); 2625e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn innerPrefix.append(" "); 2626e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn String8 innerInnerPrefix(innerPrefix); 2627e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn innerInnerPrefix.append(" "); 2628e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%sConfigurations:\n", prefix.string()); 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N=mGroupEntries.size(); 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 2631e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn String8 cname = mGroupEntries.itemAt(i).toDirName(String8()); 2632e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%s %s\n", prefix.string(), 2633e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn cname != "" ? cname.string() : "(default)"); 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2636e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("\n%sFiles:\n", prefix.string()); 2637e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn AaptDir::print(innerPrefix); 2638e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 2639e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("\n%sResource Dirs:\n", prefix.string()); 2640e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const Vector<sp<AaptDir> >& resdirs = mResDirs; 2641e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const size_t NR = resdirs.size(); 2642e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (size_t i=0; i<NR; i++) { 2643e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const sp<AaptDir>& d = resdirs.itemAt(i); 2644e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn printf("%s Type %s\n", prefix.string(), d->getLeaf().string()); 2645e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn d->print(innerInnerPrefix); 2646e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornsp<AaptDir> AaptAssets::resDir(const String8& name) const 26501553c82e084ac5763fb393857224145506771b99Joe Onorato{ 2651e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const Vector<sp<AaptDir> >& resdirs = mResDirs; 2652e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const size_t N = resdirs.size(); 26531553c82e084ac5763fb393857224145506771b99Joe Onorato for (size_t i=0; i<N; i++) { 2654e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const sp<AaptDir>& d = resdirs.itemAt(i); 26551553c82e084ac5763fb393857224145506771b99Joe Onorato if (d->getLeaf() == name) { 26561553c82e084ac5763fb393857224145506771b99Joe Onorato return d; 26571553c82e084ac5763fb393857224145506771b99Joe Onorato } 26581553c82e084ac5763fb393857224145506771b99Joe Onorato } 26591553c82e084ac5763fb393857224145506771b99Joe Onorato return NULL; 26601553c82e084ac5763fb393857224145506771b99Joe Onorato} 26611553c82e084ac5763fb393857224145506771b99Joe Onorato 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvalid_symbol_name(const String8& symbol) 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static char const * const KEYWORDS[] = { 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "abstract", "assert", "boolean", "break", 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "byte", "case", "catch", "char", "class", "const", "continue", 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "default", "do", "double", "else", "enum", "extends", "final", 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "finally", "float", "for", "goto", "if", "implements", "import", 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "instanceof", "int", "interface", "long", "native", "new", "package", 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "private", "protected", "public", "return", "short", "static", 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "strictfp", "super", "switch", "synchronized", "this", "throw", 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "throws", "transient", "try", "void", "volatile", "while", 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "true", "false", "null", 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NULL 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char*const* k = KEYWORDS; 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char*const s = symbol.string(); 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*k) { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(s, *k)) { 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k++; 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2687