X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/dadd9c1fc18bd05c84a357b56e945b5829b3bd95..c8851041649d39c6e62b94fe5238956d1f2f7f5c:/AaptAssets.cpp diff --git a/AaptAssets.cpp b/AaptAssets.cpp index d07e4de..fc655a7 100644 --- a/AaptAssets.cpp +++ b/AaptAssets.cpp @@ -17,7 +17,6 @@ static const char* kWildcardName = "any"; static const char* kAssetDir = "assets"; static const char* kResourceDir = "res"; static const char* kInvalidChars = "/\\:"; -static const char* kExcludeExtension = ".EXCLUDE"; static const size_t kMaxAssetFileName = 100; static const String8 kResString(kResourceDir); @@ -56,6 +55,7 @@ static bool validateFileName(const char* fileName) static bool isHidden(const char *root, const char *path) { + const char *ext = NULL; const char *type = NULL; // Skip all hidden files. @@ -78,12 +78,15 @@ static bool isHidden(const char *root, const char *path) // Skip CVS but don't chatter about it. return true; } else if (strcasecmp(path, "thumbs.db") == 0 - || strcasecmp(path, "picassa.ini") == 0) { + || strcasecmp(path, "picasa.ini") == 0) { // Skip suspected image indexes files. type = "index"; } else if (path[strlen(path)-1] == '~') { // Skip suspected emacs backup files. type = "backup"; + } else if ((ext = strrchr(path, '.')) != NULL && strcmp(ext, ".scc") == 0) { + // Skip VisualSourceSafe files and don't chatter about it + return true; } else { // Let everything else through. return false; @@ -100,7 +103,7 @@ static bool isHidden(const char *root, const char *path) return true; } - + // ========================================================================= // ========================================================================= // ========================================================================= @@ -139,6 +142,20 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) return 0; } + // screen layout size + if (getScreenLayoutSizeName(part.string(), &config)) { + *axis = AXIS_SCREENLAYOUTSIZE; + *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE); + return 0; + } + + // screen layout long + if (getScreenLayoutLongName(part.string(), &config)) { + *axis = AXIS_SCREENLAYOUTLONG; + *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG); + return 0; + } + // orientation if (getOrientationName(part.string(), &config)) { *axis = AXIS_ORIENTATION; @@ -146,6 +163,20 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) return 0; } + // ui mode type + if (getUiModeTypeName(part.string(), &config)) { + *axis = AXIS_UIMODETYPE; + *value = (config.uiMode&ResTable_config::MASK_UI_MODE_TYPE); + return 0; + } + + // ui mode night + if (getUiModeNightName(part.string(), &config)) { + *axis = AXIS_UIMODENIGHT; + *value = (config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT); + return 0; + } + // density if (getDensityName(part.string(), &config)) { *axis = AXIS_DENSITY; @@ -159,28 +190,35 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) *value = config.touchscreen; return 0; } - + // keyboard hidden if (getKeysHiddenName(part.string(), &config)) { *axis = AXIS_KEYSHIDDEN; *value = config.inputFlags; return 0; } - + // keyboard if (getKeyboardName(part.string(), &config)) { *axis = AXIS_KEYBOARD; *value = config.keyboard; return 0; } - + + // navigation hidden + if (getNavHiddenName(part.string(), &config)) { + *axis = AXIS_NAVHIDDEN; + *value = config.inputFlags; + return 0; + } + // navigation if (getNavigationName(part.string(), &config)) { *axis = AXIS_NAVIGATION; *value = config.navigation; return 0; } - + // screen size if (getScreenSizeName(part.string(), &config)) { *axis = AXIS_SCREENSIZE; @@ -203,7 +241,9 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) { Vector parts; - String8 mcc, mnc, loc, orient, den, touch, key, keysHidden, nav, size, vers; + String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den; + String8 touch, key, keysHidden, nav, navHidden, size, vers; + String8 uiModeType, uiModeNight; const char *p = dir; const char *q; @@ -290,6 +330,30 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) //printf("not region: %s\n", part.string()); } + if (getScreenLayoutSizeName(part.string())) { + layoutsize = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not screen layout size: %s\n", part.string()); + } + + if (getScreenLayoutLongName(part.string())) { + layoutlong = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not screen layout long: %s\n", part.string()); + } + // orientation if (getOrientationName(part.string())) { orient = part; @@ -303,6 +367,32 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) //printf("not orientation: %s\n", part.string()); } + // ui mode type + if (getUiModeTypeName(part.string())) { + uiModeType = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not ui mode type: %s\n", part.string()); + } + + // ui mode night + if (getUiModeNightName(part.string())) { + uiModeNight = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not ui mode night: %s\n", part.string()); + } + // density if (getDensityName(part.string())) { den = part; @@ -319,7 +409,7 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) // touchscreen if (getTouchscreenName(part.string())) { touch = part; - + index++; if (index == N) { goto success; @@ -328,11 +418,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not touchscreen: %s\n", part.string()); } - + // keyboard hidden if (getKeysHiddenName(part.string())) { keysHidden = part; - + index++; if (index == N) { goto success; @@ -341,11 +431,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not keysHidden: %s\n", part.string()); } - + // keyboard if (getKeyboardName(part.string())) { key = part; - + index++; if (index == N) { goto success; @@ -354,10 +444,23 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not keyboard: %s\n", part.string()); } - + + // navigation hidden + if (getNavHiddenName(part.string())) { + navHidden = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not navHidden: %s\n", part.string()); + } + if (getNavigationName(part.string())) { nav = part; - + index++; if (index == N) { goto success; @@ -366,10 +469,10 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not navigation: %s\n", part.string()); } - + if (getScreenSizeName(part.string())) { size = part; - + index++; if (index == N) { goto success; @@ -378,10 +481,10 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not screen size: %s\n", part.string()); } - + if (getVersionName(part.string())) { vers = part; - + index++; if (index == N) { goto success; @@ -390,7 +493,7 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } else { //printf("not version: %s\n", part.string()); } - + // if there are extra parts, it doesn't match return false; @@ -398,11 +501,16 @@ success: this->mcc = mcc; this->mnc = mnc; this->locale = loc; + this->screenLayoutSize = layoutsize; + this->screenLayoutLong = layoutlong; this->orientation = orient; + this->uiModeType = uiModeType; + this->uiModeNight = uiModeNight; this->density = den; this->touchscreen = touch; this->keysHidden = keysHidden; this->keyboard = key; + this->navHidden = navHidden; this->navigation = nav; this->screenSize = size; this->version = vers; @@ -422,8 +530,16 @@ AaptGroupEntry::toString() const s += ","; s += this->locale; s += ","; + s += screenLayoutSize; + s += ","; + s += screenLayoutLong; + s += ","; s += this->orientation; s += ","; + s += uiModeType; + s += ","; + s += uiModeNight; + s += ","; s += density; s += ","; s += touchscreen; @@ -432,6 +548,8 @@ AaptGroupEntry::toString() const s += ","; s += keyboard; s += ","; + s += navHidden; + s += ","; s += navigation; s += ","; s += screenSize; @@ -456,10 +574,26 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += locale; } + if (this->screenLayoutSize != "") { + s += "-"; + s += screenLayoutSize; + } + if (this->screenLayoutLong != "") { + s += "-"; + s += screenLayoutLong; + } if (this->orientation != "") { s += "-"; s += orientation; } + if (this->uiModeType != "") { + s += "-"; + s += uiModeType; + } + if (this->uiModeNight != "") { + s += "-"; + s += uiModeNight; + } if (this->density != "") { s += "-"; s += density; @@ -476,6 +610,10 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += keyboard; } + if (this->navHidden != "") { + s += "-"; + s += navHidden; + } if (this->navigation != "") { s += "-"; s += navigation; @@ -488,7 +626,7 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += version; } - + return s; } @@ -506,9 +644,9 @@ bool AaptGroupEntry::getMccName(const char* name, c++; if (tolower(*c) != 'c') return false; c++; - + const char* val = c; - + while (*c >= '0' && *c <= '9') { c++; } @@ -538,9 +676,9 @@ bool AaptGroupEntry::getMncName(const char* name, c++; if (tolower(*c) != 'c') return false; c++; - + const char* val = c; - + while (*c >= '0' && *c <= '9') { c++; } @@ -605,6 +743,57 @@ bool AaptGroupEntry::getLocaleName(const char* fileName, return false; } +bool AaptGroupEntry::getScreenLayoutSizeName(const char* name, + ResTable_config* out) +{ + if (strcmp(name, kWildcardName) == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) + | ResTable_config::SCREENSIZE_ANY; + return true; + } else if (strcmp(name, "small") == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) + | ResTable_config::SCREENSIZE_SMALL; + return true; + } else if (strcmp(name, "normal") == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) + | ResTable_config::SCREENSIZE_NORMAL; + return true; + } else if (strcmp(name, "large") == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENSIZE) + | ResTable_config::SCREENSIZE_LARGE; + return true; + } + + return false; +} + +bool AaptGroupEntry::getScreenLayoutLongName(const char* name, + ResTable_config* out) +{ + if (strcmp(name, kWildcardName) == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENLONG) + | ResTable_config::SCREENLONG_ANY; + return true; + } else if (strcmp(name, "long") == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENLONG) + | ResTable_config::SCREENLONG_YES; + return true; + } else if (strcmp(name, "notlong") == 0) { + if (out) out->screenLayout = + (out->screenLayout&~ResTable_config::MASK_SCREENLONG) + | ResTable_config::SCREENLONG_NO; + return true; + } + + return false; +} + bool AaptGroupEntry::getOrientationName(const char* name, ResTable_config* out) { @@ -621,7 +810,53 @@ bool AaptGroupEntry::getOrientationName(const char* name, if (out) out->orientation = out->ORIENTATION_SQUARE; return true; } - + + return false; +} + +bool AaptGroupEntry::getUiModeTypeName(const char* name, + ResTable_config* out) +{ + if (strcmp(name, kWildcardName) == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) + | ResTable_config::UI_MODE_TYPE_ANY; + return true; + } else if (strcmp(name, "desk") == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) + | ResTable_config::UI_MODE_TYPE_DESK; + return true; + } else if (strcmp(name, "car") == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) + | ResTable_config::UI_MODE_TYPE_CAR; + return true; + } + + return false; +} + +bool AaptGroupEntry::getUiModeNightName(const char* name, + ResTable_config* out) +{ + if (strcmp(name, kWildcardName) == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) + | ResTable_config::UI_MODE_NIGHT_ANY; + return true; + } else if (strcmp(name, "night") == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) + | ResTable_config::UI_MODE_NIGHT_YES; + return true; + } else if (strcmp(name, "notnight") == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) + | ResTable_config::UI_MODE_NIGHT_NO; + return true; + } + return false; } @@ -629,9 +864,30 @@ bool AaptGroupEntry::getDensityName(const char* name, ResTable_config* out) { if (strcmp(name, kWildcardName) == 0) { - if (out) out->density = 0; + if (out) out->density = ResTable_config::DENSITY_DEFAULT; + return true; + } + + if (strcmp(name, "nodpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_NONE; + return true; + } + + if (strcmp(name, "ldpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_LOW; + return true; + } + + if (strcmp(name, "mdpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_MEDIUM; + return true; + } + + if (strcmp(name, "hdpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_HIGH; return true; } + char* c = (char*)name; while (*c >= '0' && *c <= '9') { c++; @@ -677,7 +933,7 @@ bool AaptGroupEntry::getTouchscreenName(const char* name, if (out) out->touchscreen = out->TOUCHSCREEN_FINGER; return true; } - + return false; } @@ -687,21 +943,24 @@ bool AaptGroupEntry::getKeysHiddenName(const char* name, uint8_t mask = 0; uint8_t value = 0; if (strcmp(name, kWildcardName) == 0) { - mask = out->MASK_KEYSHIDDEN; - value = out->KEYSHIDDEN_ANY; + mask = ResTable_config::MASK_KEYSHIDDEN; + value = ResTable_config::KEYSHIDDEN_ANY; } else if (strcmp(name, "keysexposed") == 0) { - mask = out->MASK_KEYSHIDDEN; - value = out->KEYSHIDDEN_NO; + mask = ResTable_config::MASK_KEYSHIDDEN; + value = ResTable_config::KEYSHIDDEN_NO; } else if (strcmp(name, "keyshidden") == 0) { - mask = out->MASK_KEYSHIDDEN; - value = out->KEYSHIDDEN_YES; + mask = ResTable_config::MASK_KEYSHIDDEN; + value = ResTable_config::KEYSHIDDEN_YES; + } else if (strcmp(name, "keyssoft") == 0) { + mask = ResTable_config::MASK_KEYSHIDDEN; + value = ResTable_config::KEYSHIDDEN_SOFT; } - + if (mask != 0) { if (out) out->inputFlags = (out->inputFlags&~mask) | value; return true; } - + return false; } @@ -721,7 +980,31 @@ bool AaptGroupEntry::getKeyboardName(const char* name, if (out) out->keyboard = out->KEYBOARD_12KEY; return true; } - + + return false; +} + +bool AaptGroupEntry::getNavHiddenName(const char* name, + ResTable_config* out) +{ + uint8_t mask = 0; + uint8_t value = 0; + if (strcmp(name, kWildcardName) == 0) { + mask = ResTable_config::MASK_NAVHIDDEN; + value = ResTable_config::NAVHIDDEN_ANY; + } else if (strcmp(name, "navexposed") == 0) { + mask = ResTable_config::MASK_NAVHIDDEN; + value = ResTable_config::NAVHIDDEN_NO; + } else if (strcmp(name, "navhidden") == 0) { + mask = ResTable_config::MASK_NAVHIDDEN; + value = ResTable_config::NAVHIDDEN_YES; + } + + if (mask != 0) { + if (out) out->inputFlags = (out->inputFlags&~mask) | value; + return true; + } + return false; } @@ -744,7 +1027,7 @@ bool AaptGroupEntry::getNavigationName(const char* name, if (out) out->navigation = out->NAVIGATION_WHEEL; return true; } - + return false; } @@ -758,29 +1041,29 @@ bool AaptGroupEntry::getScreenSizeName(const char* name, } return true; } - + const char* x = name; while (*x >= '0' && *x <= '9') x++; if (x == name || *x != 'x') return false; String8 xName(name, x-name); x++; - + const char* y = x; while (*y >= '0' && *y <= '9') y++; if (y == name || *y != 0) return false; String8 yName(x, y-x); - + uint16_t w = (uint16_t)atoi(xName.string()); uint16_t h = (uint16_t)atoi(yName.string()); if (w < h) { return false; } - + if (out) { out->screenWidth = w; out->screenHeight = h; } - + return true; } @@ -794,22 +1077,22 @@ bool AaptGroupEntry::getVersionName(const char* name, } return true; } - + if (*name != 'v') { return false; } - + name++; const char* s = name; while (*s >= '0' && *s <= '9') s++; if (s == name || *s != 0) return false; String8 sdkName(name, s-name); - + if (out) { out->sdkVersion = (uint16_t)atoi(sdkName.string()); out->minorVersion = 0; } - + return true; } @@ -819,11 +1102,16 @@ int AaptGroupEntry::compare(const AaptGroupEntry& o) const if (v == 0) v = mnc.compare(o.mnc); if (v == 0) v = locale.compare(o.locale); if (v == 0) v = vendor.compare(o.vendor); + if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize); + if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong); if (v == 0) v = orientation.compare(o.orientation); + if (v == 0) v = uiModeType.compare(o.uiModeType); + if (v == 0) v = uiModeNight.compare(o.uiModeNight); if (v == 0) v = density.compare(o.density); if (v == 0) v = touchscreen.compare(o.touchscreen); if (v == 0) v = keysHidden.compare(o.keysHidden); if (v == 0) v = keyboard.compare(o.keyboard); + if (v == 0) v = navHidden.compare(o.navHidden); if (v == 0) v = navigation.compare(o.navigation); if (v == 0) v = screenSize.compare(o.screenSize); if (v == 0) v = version.compare(o.version); @@ -837,14 +1125,39 @@ ResTable_config AaptGroupEntry::toParams() const getMccName(mcc.string(), ¶ms); getMncName(mnc.string(), ¶ms); getLocaleName(locale.string(), ¶ms); + getScreenLayoutSizeName(screenLayoutSize.string(), ¶ms); + getScreenLayoutLongName(screenLayoutLong.string(), ¶ms); getOrientationName(orientation.string(), ¶ms); + getUiModeTypeName(uiModeType.string(), ¶ms); + getUiModeNightName(uiModeNight.string(), ¶ms); getDensityName(density.string(), ¶ms); getTouchscreenName(touchscreen.string(), ¶ms); getKeysHiddenName(keysHidden.string(), ¶ms); getKeyboardName(keyboard.string(), ¶ms); + getNavHiddenName(navHidden.string(), ¶ms); getNavigationName(navigation.string(), ¶ms); getScreenSizeName(screenSize.string(), ¶ms); getVersionName(version.string(), ¶ms); + + // Fix up version number based on specified parameters. + int minSdk = 0; + if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE) + != ResTable_config::UI_MODE_TYPE_ANY + || (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT) + != ResTable_config::UI_MODE_NIGHT_ANY) { + minSdk = SDK_FROYO; + } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE) + != ResTable_config::SCREENSIZE_ANY + || (params.screenLayout&ResTable_config::MASK_SCREENLONG) + != ResTable_config::SCREENLONG_ANY + || params.density != ResTable_config::DENSITY_DEFAULT) { + minSdk = SDK_DONUT; + } + + if (minSdk > params.sdkVersion) { + params.sdkVersion = minSdk; + } + return params; } @@ -1078,29 +1391,29 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, { DIR* dir = NULL; - + dir = opendir(srcDir.string()); if (dir == NULL) { fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno)); return UNKNOWN_ERROR; } - + /* * Slurp the filenames out of the directory. */ while (1) { struct dirent* entry; - + entry = readdir(dir); if (entry == NULL) break; - + if (isHidden(srcDir.string(), entry->d_name)) continue; fileNames.add(String8(entry->d_name)); } - + closedir(dir); } @@ -1312,7 +1625,7 @@ void AaptAssets::addResource(const String8& leafName, const String8& path, sp subdir = res->makeDir(dirname); sp grr = new AaptGroup(leafName, path); grr->addFile(file); - + subdir->addFile(leafName, grr); } @@ -1321,10 +1634,10 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) { int count; int totalCount = 0; - int i; - int arg = 0; FileType type; - const char* res; + const Vector& resDirs = bundle->getResourceSourceDirs(); + const size_t dirCount =resDirs.size(); + sp current = this; const int N = bundle->getFileSpecCount(); @@ -1377,28 +1690,35 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) /* * If a directory of resource-specific assets was supplied, slurp 'em up. */ - res = bundle->getResourceSourceDir(); - if (res) { - type = getFileType(res); - if (type == kFileTypeNonexistent) { - fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res); - return UNKNOWN_ERROR; - } - if (type == kFileTypeDirectory) { - count = slurpResourceTree(bundle, String8(res)); + for (size_t i=0; i0) { + sp nextOverlay = new AaptAssets(); + current->setOverlay(nextOverlay); + current = nextOverlay; + } + count = current->slurpResourceTree(bundle, String8(res)); - if (count < 0) { - totalCount = count; - goto bail; + if (count < 0) { + totalCount = count; + goto bail; + } + totalCount += count; + } + else { + fprintf(stderr, "ERROR: '%s' is not a directory\n", res); + return UNKNOWN_ERROR; } - totalCount += count; - } - else { - fprintf(stderr, "ERROR: '%s' is not a directory\n", res); - return UNKNOWN_ERROR; } + } - /* * Now do any additional raw files. */ @@ -1681,6 +2001,19 @@ void AaptAssets::print() const AaptDir::print(); } +sp AaptAssets::resDir(const String8& name) +{ + const Vector >& dirs = mDirs; + const size_t N = dirs.size(); + for (size_t i=0; i& d = dirs.itemAt(i); + if (d->getLeaf() == name) { + return d; + } + } + return NULL; +} + bool valid_symbol_name(const String8& symbol) {